详解关于微信setData回调函数中的坑


Posted in Javascript onFebruary 18, 2019

最近在做录音功能,需求大体是这样的:点击开始录音按钮,页面状态变为录音中,然后开始录音。

不过伟大的测试同学发现了一个问题:当快速的连续点击开始录音按钮时,会触发多次开始录音的事件,这样在结束录音时就仍然会有一个正在录音中的标识,像这样:

详解关于微信setData回调函数中的坑

下面开始曲折的修复之路:

最开始的代码是这样的:

Page({

 /**
  * 生命周期函数--监听页面加载
  */
 onLoad: function(options) {
  // 初始化录音管理器
  this.recorderManager = wx.getRecorderManager()

  // 录音开始事件
  this.recorderManager.onStart(() => {
   
  })
 },

 /**
  * 录音按钮点击事件
  */
 tapRecordBtn: function() {
  this.setData({
   // 切换页面显示
  }, () => {
   // 开始录音
   this.recorderManager.start({})
  })
 },
})

这时我的猜测是:页面重新渲染之前,按钮还是显示状态,所以还能被点击。

那既然这样,就加个标识,在一次点击之后,到页面重新渲染之前,都不能再次点击就好了,代码如下:

Page({

 /**
  * 生命周期函数--监听页面加载
  */
 onLoad: function(options) {
  // 初始化录音管理器
  this.recorderManager = wx.getRecorderManager()
  // 录音开始按钮点击标识
  this.isRecordBtnClicked = false

  // 录音开始事件
  this.recorderManager.onStart(() => {

  })
 },

 /**
  * 录音按钮点击事件
  */
 tapRecordBtn: function() {
  // 如果录音按钮已被点击(录音即将开始),则不会再次触发开始录音事件
  if (this.isRecordBtnClicked) {
   return
  }
  this.isRecordBtnClicked = true

  this.setData({
   // 切换页面显示
  }, () => {
   this.isRecordBtnClicked = false
   // 开始录音
   this.recorderManager.start({})
  })
 },
})

想法是好的,不过并没有实现想要的效果。还是可以被多次点击。

于是在多次实验之后,改为如下的方式(可行):

Page({

 /**
  * 生命周期函数--监听页面加载
  */
 onLoad: function(options) {
  // 初始化录音管理器
  this.recorderManager = wx.getRecorderManager()
  // 录音开始按钮点击标识
  this.isRecordBtnClicked = false

  // 录音开始事件
  this.recorderManager.onStart(() => {
   // 将录音按钮的点击状态在录音开始时修改
   this.isRecordBtnClicked = false
  })
 },

 /**
  * 录音按钮点击事件
  */
 tapRecordBtn: function() {
  // 如果录音按钮已被点击(录音即将开始),则不会再次触发开始录音事件
  if (this.isRecordBtnClicked) {
   return
  }
  this.isRecordBtnClicked = true

  this.setData({
   // 切换页面显示
  }, () => {
   // 开始录音
   this.recorderManager.start({})
  })
 },

})

将按钮的点击状态在录音开始事件中进行重置,就可以解决这个问题了。

说一下最后验证的结果:setData() 方法的回调函数并不是在页面重新渲染完之后才执行的,所以并不能以回调函数作为一个明确的时间点来处理一些逻辑。而由于recorderManager.onStart() 方法触发时会有一定的延时,所以间接的解决了这个问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一个cssQuery对象 javascript脚本实现代码
Jul 21 Javascript
让firefox支持IE的一些方法的javascript扩展函数代码
Jan 02 Javascript
jQuery CSS()方法改变现有的CSS样式表
Sep 09 Javascript
js实现Select列表内容自动滚动效果代码
Aug 20 Javascript
jquery专业的导航菜单特效代码分享
Aug 29 Javascript
聊一聊JS中this的指向问题
Jun 17 Javascript
基于JavaScript实现滑动门效果
Mar 16 Javascript
JS实现数组的增删改查操作示例
Aug 29 Javascript
JavaScript 九种跨域方式实现原理
Feb 11 Javascript
vue实现前端分页完整代码
Jun 17 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
Jul 18 Javascript
详细分析vue表单数据的绑定
Jul 20 Javascript
jQuery实现的五星点评功能【案例】
Feb 18 #jQuery
JS中min函数实例讲解
Feb 18 #Javascript
jQuery实现的隔行变色功能【案例】
Feb 18 #jQuery
小程序实现列表多个批量倒计时
Jan 29 #Javascript
记一次vue-webpack项目优化实践详解
Feb 17 #Javascript
Vuepress 搭建带评论功能的静态博客的实现
Feb 17 #Javascript
详解javascript replace高级用法
Feb 17 #Javascript
You might like
自己做矿石收音机
2021/03/02 无线电
php实现图片缩放功能类
2013/12/18 PHP
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
关于js注册事件的常用方法
2013/04/03 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
angular.bind使用心得
2015/10/26 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
Python运算符重载用法实例分析
2015/06/01 Python
python下载库的步骤方法
2019/10/12 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
python2 对excel表格操作完整示例
2020/02/23 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
Python基于内置函数type创建新类型
2020/10/22 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
2020/05/28 HTML / CSS
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
德国帽子专家:Hutshopping
2019/11/03 全球购物
金鑫耀Java笔试题
2014/09/06 面试题
cf收人广告词大全
2014/03/14 职场文书
汽车专业求职信
2014/06/05 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
乡镇党建工作汇报材料
2014/10/27 职场文书
管理人员岗位职责
2015/02/14 职场文书
初中班长竞选稿
2015/11/20 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS