纠结这个问题好久了,几乎就是仿照例子来的。
先点播放,再点暂停,就会报错。
只有第一次会报,第二次再播放-暂停就不会了。
请问这是为什么呀?
是的,主要问题就是 pause 和 audio.src 打断了音频的加载,如果音频已经加载至可以开始播放,那么不会抛出此错误
虽不太准确,但可以这么理解
audio.pause()没有返回值,暂停播放是立即执行的。因为是暂停播放,所以不涉及资源的加载,因此没有”被打断“的问题。
感谢感谢!大概懂了……
那是不是可以认为:
1、只要音频加载速度够快,后者在play和pause之间等够足够的时间,就可以避免报错呢?
(事实上我点play后隔了好几秒再点的pause,不过这里网速也是够慢的,因此我也并不确定点击pause时音频是否有加载成功)
2、第二次点“播放-暂停”不报错,是不是因为缓存里已经有了音频,因此跳过promise阶段?3、我的小程序只是简单“播放-暂停”,还没有涉及src audio.src = ‘newmusic.mp3’ ,请问是 audio.pause()执行时会有这个步骤吗?
这个问题可以参考 https://developers.google.com/web/updates/2017/06/play-request-was-interrupted
audio 组件在内部是用 HTML5 audio 实现的。audio.play() 方法调用后并不会立即使音频播放,而是会加载音频资源并返回一个 Promise,在资源加载到可以开始播放的时候才开始真正播放音频并将 Promise 的状态变为 fullfilled。而这一行为会被 audio.pause() 以及设置新的src audio.src = ‘newmusic.mp3’ 打断,使 Promise 的状态变为 rejected,此时会抛出一个错误。
这个问题我们正在跟进中,会在之后的版本给出一个解决方案以避免此类问题。