复现步骤:多次点击页面其中一个按钮
期望表现:每次点击时触发onError,并在onError内通过player.offError取消onError。实现“onceError”效果,即一次性事件监听。并且能够正确的计算错误次数。(进一步:能够基于Promise异步封装、复杂逻辑等,希望基于此特性实现。)
错误截图:
页面及代码截图:
框架类型 | 问题类型 | API/组件名称 | 终端类型 | 微信版本 | 基础库版本 |
---|---|---|---|---|---|
小程序 | Bug | wx.createInnerAudioContext | 微信安卓客户端 | 8.0.41 | 3.1.1 |
3 个回答
在小程序的
InnerAudioContext
对象中,offError
方法无法直接在onError
处理函数中使用。考虑直接换背景音频 api ?跨页面、切后台都不会中断
背景音频 api ,全局一个实例,每次播放都是设置 audio.src 就用不着判断 onError 了
最终方法:想要实现onceError,可在onError时,调用player.destroy()即可。
另外 player.src 赋值要在player.onError(onError)注册事件之后(防止player.src = 123 这种无效src也会走onError,不会等到play方法调用)。
以下展示关键代码,项目中我基于以下方式,使用了promise进行了二次封装:
const player = wx.createInnerAudioContext(); player.playAudio = (src) => { function onError(err) { console.debug('onerr: ', err); player.offError(onError); player.offStop(onStop); player.offEnded(onEnded); player.destroy(); } function onStop() { player.offError(onError); player.offStop(onStop); player.offEnded(onEnded); } function onEnded() { player.offError(onError); player.offStop(onStop); player.offEnded(onEnded); } player.onError(onError); player.onStop(onStop); player.onEnded(onEnded); player.src = src; player.play(); }