详解关于微信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 相关文章推荐
js获取对象为null的解决方法
Nov 21 Javascript
javascript列表框操作函数集合汇总
Nov 28 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
Dec 04 Javascript
jquery仿搜索自动联想功能代码
May 23 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
Jan 13 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
Sep 09 Javascript
javascript中异常处理案例(推荐)
Oct 03 Javascript
JS实现浏览器打印、打印预览示例
Feb 28 Javascript
详解mpvue中小程序自定义导航组件开发指南
Feb 11 Javascript
vue.js中ref和$refs的使用及示例讲解
Aug 14 Javascript
node.js制作一个简单的登录拦截器
Feb 10 Javascript
jquery实现广告上下滚动效果
Mar 04 jQuery
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
php set_time_limit()函数的使用详解
2013/06/05 PHP
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
Prototype Date对象 学习
2009/07/12 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2010/02/04 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
python概率计算器实例分析
2015/03/25 Python
Python单元测试框架unittest简明使用实例
2015/04/13 Python
django定期执行任务(实例讲解)
2017/11/03 Python
tensorflow实现KNN识别MNIST
2018/03/12 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
在Python中定义一个常量的方法
2018/11/10 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
基于Python的接口自动化读写excel文件的方法
2021/01/15 Python
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
优秀教师的感人事迹
2014/02/04 职场文书
2014年项目工作总结
2014/11/24 职场文书
四风之害观后感
2015/06/09 职场文书
旅游投诉信范文
2015/07/02 职场文书
用Python简陋模拟n阶魔方
2021/04/17 Python
python运行脚本文件的三种方法实例
2022/06/25 Python