innerAudioContext.onPlay() 执行了三次
发布于 5 年前 作者 chaodeng 12108 次浏览 来自 问答

代码里只调用了一次innerAudioContext.play();结果innerAudioContext.onPlay() 和

innerAudioContext.onEnded()

都执行了三次。

是bug?

10 回复

这个实现方法有很多呀……

比如将事件注册挂在onLoad的时候做就可以了

好的谢谢

按你这么说,我第一次播放也应该只调用onplay()一次吧,但是我这边第一次就三次了

真机微信版本是最新的,开发工具也是最新的,机型测过5s 、6,基础版本库1.60.

<view catchtap="record" style="display: block;height: 40px;line-height: 40px;width: 100px;font-size: 14px;color: #fff;border-radius: 4px;background: #fa7829;text-align: center;">{{record_status}}</view>

这段是wxml的内容

const recorderManager = wx.getRecorderManager();
const innerAudioContext = wx.createInnerAudioContext();
// pages/test/test.js
Page({
 
  /**
   * 页面的初始数据
   */
  data: {
      record_status: '未录音'
  },
 
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
   
  },
 
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
   
  },
 
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
   
  },
 
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
   
  },
 
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
   
  },
 
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
   
  },
 
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
   
  },
 
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
   
  },
  record: function() {
        var that = this;
        var record_status = that.data.record_status;
        if (record_status === '未录音') {
            recorderManager.start({
                duration: 60000,
                sampleRate: 44100,
                numberOfChannels: 1,
                encodeBitRate: 192000,
                format: 'mp3',
                frameSize: 50
            })
            record_status = '录音中'
        } else if (record_status === '录音中') {
            recorderManager.stop();
        } else if (record_status === '录音结束') {
            innerAudioContext.src = that.data.recorderPath.tempFilePath;
            innerAudioContext.play();
        } else if (record_status === '录音播放中') {
            innerAudioContext.stop();
        }
 
        recorderManager.onStop((res) => {
            record_status = '录音结束';
            console.log(res);
            that.setData({
                record_status: record_status,
                recorderPath: res   
            })
        });
 
        innerAudioContext.onPlay(() => {
            console.log('录音播放中');
            record_status = '录音播放中';
            that.setData({
                record_status: record_status
            })
        })
 
        innerAudioContext.onStop(() => {
            console.log('录音播放停止');
            record_status = '录音播放停止';
            innerAudioContext.destroy();
            that.setData({
                record_status: record_status
            })
        })
 
        innerAudioContext.onEnded(() => {
            console.log('录音播放结束');
            record_status = '录音播放结束';
            innerAudioContext.destroy();
            that.setData({
                record_status: record_status
            })
        })
        that.setData({
            record_status: record_status
        })
  }
})

这个是控制台的输出

你好,请提供一下能复现问题的简单代码示例。

方不方便提供下微信版本号,机型和基础库版本,和完整能复现问题的例子?我这边尝试复现下触发3次的问题。

这里你每次点击都注册了一遍事件,点击了三次就注册了三遍事件了。如果你只想跑一遍回调,就把注册事件的代码分拆出去跑一次就可以了。

你这里重设了src,点击多少次录音按钮就调用多少次onplay是正常的。

你意思是把监听事件放到page()外面吗?如果是这样的话我怎么去操作page里面的数据状态?

我是做录音然后播放的,录完,点击播放,现在是点击多少次那个录音按钮就会调用多少次onplay(),我后面每一次点击都会增加一次

回到顶部