详解关于微信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 获取select下拉列表值的代码
Sep 07 Javascript
JS 获取滚动条高度示例代码
Oct 24 Javascript
JavaScript实现获取dom中class的方法
Feb 09 Javascript
JavaScript实现添加及删除事件的方法小结
Aug 04 Javascript
JavaScript模块规范之AMD规范和CMD规范
Oct 27 Javascript
JavaScript性能优化总结之加载与执行
Aug 11 Javascript
JavaScript动态检验密码强度的实现方法
Nov 09 Javascript
js实现时间轴自动排列效果
Mar 09 Javascript
javascript 的变量、作用域和内存问题
Apr 19 Javascript
MUI实现上拉加载和下拉刷新效果
Jun 30 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
Aug 09 Javascript
vue+axios实现post文件下载
Sep 25 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
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
javascript文件加载管理简单实现方法
2015/07/25 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
中国最大的名表商城:万表网
2016/08/29 全球购物
体育教育专业毕业生自荐信
2013/11/15 职场文书
售后专员岗位职责
2013/12/08 职场文书
医学生自我评价
2014/01/27 职场文书
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
文明好少年事迹材料
2014/08/19 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
JS class语法糖的深入剖析
2022/07/07 Javascript