最近在做录音功能,需求大体是这样的:点击开始录音按钮,页面状态变为录音中,然后开始录音。

不过伟大的测试同学发现了一个问题:当快速的连续点击开始录音按钮时,会触发多次开始录音的事件,这样在结束录音时就仍然会有一个正在录音中的标识,像这样:

下面开始曲折的修复之路:

最开始的代码是这样的:

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 = truethis.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 = truethis.setData({// 切换页面显示}, () => {// 开始录音this.recorderManager.start({})})},})

结论

将按钮的点击状态在录音开始事件中进行重置,就可以解决这个问题了。
说一下最后验证的结果:setData() 方法的回调函数并不是在页面重新渲染完之后才执行的,所以并不能以回调函数作为一个明确的时间点来处理一些逻辑。而由于recorderManager.onStart() 方法触发时会有一定的延时,所以间接的解决了这个问题。

关于微信 setData 回调函数中的坑相关推荐

  1. 回调函数中删除对象引发的隐晦非法访问崩溃问题

    回调函数,这里说的是一种笼统的概念,泛指一个对象或者一个过程调用陷入另一个对象或过程.本文想要描述的就是在回调函数中执行释放.删除动作去销毁调用调用者相关联的内容,导致访问非法. 下面用一段代码来简述 ...

  2. 来自Android客户端什么意思,如何通过回调函数中的Node.js来自Android客户端

    我想从插座Android客户端将数据发送到服务器的Node.js .. 在服务器端做了什么香港专业教育学院:如何通过回调函数中的Node.js来自Android客户端 socket.on('new u ...

  3. JavaScript 回调函数中的 return false 问题

    今天一个同事问了我一个问题,就是在 Ajax 方法中,请求成功后(success)的回调函数中根据响应的值来判断程序是否继续执行,他不解的是在回调函数中已经 return false 了,但是 Aja ...

  4. 回调函数中window.open()被拦截

    在回调函数中window.open默认是会被拦截的,因为浏览器判断它不是用户自己打开的,存在安全风险,所以可以伪造一个用户点击事件来避开,代码如下: function newWindow(url, i ...

  5. python线程池回调函数_python回调函数中使用多线程的方法

    下面的demo是根据需求写的简单测试脚本 #!/usr/bin/env python # coding: utf-8 # 第一个列表为依赖组件和版本号,后面紧跟负责人名称 # 接着出现第二个以来组建列 ...

  6. 微信小程序(微信支付回调函数)

    /*** 微信支付回调函数** @param body* @param request* @return 所有逻辑完成, 返回true, 完成支付, 并将订单状态改变*/@Override@Trans ...

  7. ROS开发系列(7)- 在回调函数中发布topic

    文章目录 1 实现方法 2 实现代码 3 运行结果 参考 1 实现方法 在ROS开发系列(6)- zed深度信息与datknet的boundingbox信息融合基础上进行的修改. 创建一个自定义消息类 ...

  8. spring返回数据使用ajax,【spring 后台跳转前台】使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中...

    问题1: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示: 问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方法 ...

  9. C++回调函数中调用Python函数出现的死锁问题调试及解决

    一.查找死锁原因: 1.使用gdb exe指令进入gdb命令行,再输入r运行可执行文件 gdb /home/sdhm/catkin_ws/devel/lib/gpd_ros/gpd_server GN ...

最新文章

  1. Bzoj2110--Wc2011Xor
  2. 聊一聊 Spring 中的线程安全性
  3. Celery 进阶使用
  4. 终于有篇看的懂的 B 树文章了!
  5. 神策数据加入中国大数据产业生态联盟,神策营销云及融媒解决方案获联盟认证...
  6. 【CV】深度了解自监督学习,就看这篇解读 !SimMIM:掩码图像建模的简单框架...
  7. mysql 日期和时间类型
  8. 程序员35岁前需要完成的10件事
  9. Android 系统性能优化(74)---如何减少lowmemory的发生几率
  10. linux和Windows之间互传文件
  11. 安装VMWare tools 及安装后/mnt中有hgfs但没共享文件的解决办法
  12. Android XML的操作(SAX)
  13. C++11 并发指南三(Lock 详解)(转载)
  14. oracle 分区表转换,Oracle 12.2之后ALTER TABLE .. MODIFY转换非分区表为分区表
  15. 简单的springboot应用,日志,静态资源配置
  16. 小鑫の日常系列故事(七)——小纸条 (字符串) SDUT
  17. 全手工杂拌面——韩国才有的中华料理 冬至餐桌上的25道家常手工主食
  18. 【设计模式】Unity3D 观察者模式
  19. 有道云笔记免费使用视图中背景纸张
  20. 如何让div靠右_如何让div靠右

热门文章

  1. 算法:删除链表中重复的元素||
  2. linux命令more
  3. 虚函数表 vtable
  4. 用宏定义代替printf函数
  5. springboot自动配置流程
  6. python二十九:__name__
  7. Xen为什么一定要进入内核 —— [简译] KVM is Linux, Xen is not
  8. 设计模式 分析模式 华容道 中文分词算法......
  9. 利用源代码包搭建LAMP
  10. Android重要组件之一 Service 服务讲解学习(一)