收藏
回答

小程序InnerAudioContext对象offError方法无法在onError处理函数中使用

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug wx.createInnerAudioContext 微信安卓客户端 8.0.41 3.1.1

复现步骤:多次点击页面其中一个按钮

期望表现:每次点击时触发onError,并在onError内通过player.offError取消onError。实现“onceError”效果,即一次性事件监听。并且能够正确的计算错误次数。(进一步:能够基于Promise异步封装、复杂逻辑等,希望基于此特性实现。)

错误截图:

页面及代码截图:

最后一次编辑于  2023-09-24
回答关注问题邀请回答
收藏

3 个回答

  • CRMEB
    CRMEB
    2023-09-25

    在小程序的 InnerAudioContext 对象中,offError 方法无法直接在 onError 处理函数中使用。

    2023-09-25
    有用 1
    回复 1
    • Kris
      Kris
      2023-09-25
      感谢您的答复,还是替希望能够支持这个方式
      2023-09-25
      回复
  • 夏味
    夏味
    2023-09-24

    考虑直接换背景音频 api ?跨页面、切后台都不会中断

    背景音频 api ,全局一个实例,每次播放都是设置 audio.src 就用不着判断 onError 了

    2023-09-24
    有用 1
    回复 1
    • Kris
      Kris
      2023-09-25
      感谢您的建议,我尝试一下背景音这个API
      2023-09-25
      回复
  • Kris
    Kris
    2023-09-26

    最终方法:想要实现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();
    }
    
    2023-09-26
    有用
    回复
登录 后发表内容