详解关于微信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代码
Dec 04 Javascript
JavaScript学习小结(7)之JS RegExp
Nov 29 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
Jan 21 Javascript
AngularJS中如何使用echart插件示例详解
Oct 26 Javascript
JavaScript编写九九乘法表(两种任选)
Feb 04 Javascript
jQuery自定义图片上传插件实例代码
Apr 04 jQuery
设置cookie指定时间失效(实例代码)
May 28 Javascript
vue增删改查的简单操作
Jul 15 Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
Nov 29 Javascript
微信小程序数据存储与取值详解
Jan 30 Javascript
jquery 遍历hash操作示例【基于ajax交互】
Oct 12 jQuery
JavaScript实现世界各地时间显示
Sep 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
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
PHP实现微信申请退款功能
2018/10/01 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
JavaScript 基础问答三
2008/12/03 Javascript
js 日期转换成中文格式的函数
2009/07/07 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
js实现简单页面全屏
2019/09/17 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
python实现爬山算法的思路详解
2019/04/09 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
详解python对象之间的交互
2020/09/29 Python
Python xmltodict模块安装及代码实例
2020/10/05 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
精选奢华:THE LIST
2019/09/05 全球购物
班级出游活动计划书
2014/08/15 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书