详解关于微信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 相关文章推荐
document对象execCommand的command参数介绍
Aug 01 Javascript
js下将字符串当函数执行的方法
Jul 13 Javascript
jQuery Ajax中的事件详细介绍
Apr 16 Javascript
JavaScript中Cookies的相关使用教程
Jun 04 Javascript
在使用JSON格式处理数据时应该注意的问题小结
May 20 Javascript
Vue.js简易安装和快速入门(第二课)
Oct 17 Javascript
vue如何通过id从列表页跳转到对应的详情页
May 01 Javascript
JS实现区分中英文并统计字符个数的方法示例
Jun 09 Javascript
微信小程序实现手指触摸画板
Jul 09 Javascript
Vue按时间段查询数据组件使用详解
Aug 21 Javascript
vite2.0+vue3移动端项目实战详解
Mar 03 Vue.js
vue 实现弹窗关闭后刷新效果
Apr 08 Vue.js
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
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
js 通用订单代码
2013/12/23 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
vue keep-alive的简单总结
2021/01/25 Vue.js
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
如何通过Python实现标签云算法
2019/07/02 Python
python urllib爬虫模块使用解析
2019/09/05 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
商场端午节活动方案
2014/01/29 职场文书
宿舍标语大全
2014/06/19 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
道德与公民自我评价
2015/03/09 职场文书
小学生教师节广播稿
2015/08/19 职场文书
运动会跳远广播稿
2015/08/19 职场文书