详解关于微信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 相关文章推荐
Javascript和Ajax中文乱码吐血版解决方案
Dec 21 Javascript
JavaScript中的一些定位属性[图解]
Jul 14 Javascript
javaScript 删除字符串空格多种方法小结
Oct 24 Javascript
鼠标放在图片上显示大图的JS代码
Mar 26 Javascript
从数组中随机取x条不重复数据的JS代码
Dec 24 Javascript
node.js中的http.response.end方法使用说明
Dec 14 Javascript
JavaScript使用function定义对象并调用的方法
Mar 23 Javascript
js限制文本框的输入内容代码分享(3类)
Aug 20 Javascript
JS HTML5拖拽上传图片预览
Jul 18 Javascript
Javascript 跨域知识详细介绍
Oct 30 Javascript
bootstrap table表格客户端分页实例
Aug 07 Javascript
JavaScript数组排序小程序实现解析
Jan 13 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
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
浅谈JavaScript中null和undefined
2015/07/09 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
vue绑定设置属性的多种方式(5)
2017/08/16 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
vue实现登录拦截
2020/06/29 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
python小技巧之批量抓取美女图片
2014/06/06 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
python实现识别相似图片小结
2016/02/22 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
python实现简单多人聊天室
2018/12/11 Python
Python代码注释规范代码实例解析
2020/08/14 Python
python 调用Google翻译接口的方法
2020/12/09 Python
清洁工岗位职责
2014/01/29 职场文书
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
《颐和园》教学反思
2014/02/26 职场文书
厂区绿化方案
2014/05/08 职场文书
文明城市标语
2014/06/16 职场文书
预防煤气中毒方案
2014/06/16 职场文书
股东大会通知
2015/04/24 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL
python创建字典及相关管理操作
2022/04/13 Python