详解关于微信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不能获取隐藏的div的宽度只能先显示后获取
Sep 04 Javascript
JS倒计时代码汇总
Nov 25 Javascript
使用jquery动态加载js文件的方法
Dec 24 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
Feb 20 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
Feb 20 Javascript
JavaScript计算两个日期时间段内日期的方法
Mar 16 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
Mar 18 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
Nov 30 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
May 26 Javascript
如何使用headjs来管理和异步加载js
Nov 29 Javascript
jQuery中ajax获取数据赋值给页面的实例
Dec 31 jQuery
JavaScript实现像雪花一样的Hexaflake分形
Jul 07 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/04 咖啡文化
收集的PHP中与数组相关的函数
2007/03/22 PHP
php session安全问题分析
2011/06/24 PHP
如何取得中文字符串中出现次数最多的子串
2013/08/08 PHP
php中的strpos使用示例
2014/02/27 PHP
PHP向浏览器输出内容的4个函数总结
2014/11/17 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
php array_map()函数实例用法
2021/03/03 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
市场营销专业毕业生求职信
2014/03/26 职场文书
公司授权委托书范本
2014/04/03 职场文书
兵马俑导游词
2015/02/02 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
校园安全教育心得体会
2016/01/15 职场文书
详解Python中下划线的5种含义
2021/07/15 Python
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP