详解关于微信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 文档的编码问题解决
Mar 01 Javascript
5个javascript的数字格式化函数分享
Dec 07 Javascript
JavaScript对象创建及继承原理实例解剖
Feb 28 Javascript
老生常谈 js中this的指向
Jun 30 Javascript
微信小程序 小程序制作及动画(animation样式)详解
Jan 06 Javascript
socket.io实现在线群聊功能
Apr 07 Javascript
JavaScript实现网页头部进度条刷新
Apr 16 Javascript
详解Angular 4 表单快速入门
Jun 05 Javascript
javascript input输入框模糊提示功能的实现
Sep 25 Javascript
vue.js template模板的使用(仿饿了么布局)
Aug 13 Javascript
微信小程序实现跳转的几种方式总结(推荐)
Apr 24 Javascript
js中延迟加载和预加载的具体使用
Jan 14 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/01 无线电
header()函数使用说明
2006/11/23 PHP
php自动加载的两种实现方法
2010/06/21 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
destoon数据库表说明汇总
2014/07/15 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
Vue.js组件通信的几种姿势
2017/10/23 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
2018/01/09 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
Python中的类与类型示例详解
2019/07/10 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
项目合作计划书
2014/01/09 职场文书
户外用品商店创业计划书
2014/01/29 职场文书
采购意向书范本
2014/03/31 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
夫妻婚内购房协议书
2014/10/05 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
golang特有程序结构入门教程
2021/06/02 Python
Win11 21h2可以升级22h2吗?看看你的电脑符不符合要求
2022/07/07 数码科技