微信小程序—setTimeOut定时器的问题及解决


Posted in Javascript onJuly 26, 2019

背景

实验室需要将项目的app搬到微信的小程序上,终于知道为什么程序员是手艺人了,只要有需求,就要想方设法去填充这种需求,去年是小程序的元年了可以说,去年冬天一个叫跳一跳的小程序游戏出现在我的微信中,当时就觉得腾讯是真的牛皮。一时间很多的软件小程序版相继出现,各大微信公众号也开始关联小程序。小程序相比于app,有着独特的优势,其中最大的就是没有ios和android平台之分,但是同时也有局限,你给我开发个小程序王者荣耀试试。

定时任务

微信小程序API中有两种定时任务

  • setInterval
  • setTimeOut

这两者都能实现定时任务,比如实现一个定时器,但是建议采用后者setTimeOut,理由是前者并不精确。详细请参考

https://www.zhihu.com/question/20479535

setTimeOut用法

不多说直接上:

var timerName = setTimeOut(function() {
	//循环代码
}, delay)

这里在循环代码处做我们需要循环处理的逻辑,delay是延迟的毫秒数,5秒 = 5 * 1000,timerName是返回的定时器名称,有什么用,因为要取消这个定时器就需要给需要给出取消的定时器名称

clearTimeOut(timerName)


我有一个需求是每五秒获取一次位置

startReportHeart() {
   var timerTem = setTimeout(function () {
     that.heartReport();
   }, app.globalConfig.heart_delay)
   // 保存定时器name
   that.setData({
     timer: timerTem
   })
 },

heartReport()就是获取位置信息,这样的效果是,只执行了一次。然后查看了一通资料,发现这个setTimeOut只是在delay毫秒之后执行代码,嗦嘎。

那如何才能循环执行呢?——>递归登场

好吧,我的递归就是(错误代码)

startReportHeart() {
   var timerTem = setTimeout(function () {
     that.heartReport();
   }, app.globalConfig.heart_delay)
   // 保存定时器name
    that.setData({
      timer: timerTem
   })
   })
   that.startReportHeart()
 },

好像没有毛病啊,自递归调用,嗯,没毛病,但是,,,,情况就是,瞬间出现了堆栈溢出。哈哈哈哈哈哈哈。。。。。。。
分析:

我在startReportHeart函数中开启了一个timer,5秒后开始执行,heartReport获取位置信息,此时直接递归调用自己,再开启一个timer,我的天,这么愚蠢的代码,是谁写的,没错就是我。手动捂脸。

在知道了原因之后,那么如何才能解决呢?我们需要5秒后在一次执行,对就是这个需求,那么自然就是在timer中调用自身啊。笨蛋。

正确代码:

startReportHeart() {
   var timerTem = setTimeout(function () {
     that.heartReport();
     that.startReportHeart()
   }, app.globalConfig.heart_delay)
   // 保存定时器name
   that.setData({
      timer: timerTem
   })
 },

就这样完美。

总结

有的时候,遇到的坑真的很想打自己一巴掌,但是解决坑的过程,并发现自己的愚蠢却是一件非常开心的事呢。这个过程也是十分的funning呢。

小程序开发刚开始一周时间,是的,一周上手,一点一点,现在越来越顺手,虽然写的东西比较low,但是再一次印证了那句话,只有实践才是最好的学习方式。不要找什么从入门到精通,你会发现,这些都会让你从入门到放弃。

,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值

Javascript 相关文章推荐
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
Nov 30 Javascript
js原型链原理看图说明
Jul 07 Javascript
设置checkbox为只读(readOnly)的两种方式
Oct 11 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
Feb 27 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
详解JavaScript调用栈、尾递归和手动优化
Jun 03 Javascript
jQuery实现基本动画效果的方法详解
Sep 06 jQuery
微信小程序时间控件picker view使用详解
Dec 28 Javascript
微信小程序开发技巧汇总
Jul 15 Javascript
Vue实现数据表格合并列rowspan效果
Nov 30 Javascript
react 不用插件实现数字滚动的效果示例
Apr 14 Javascript
浅谈javascript如何获取文件后缀名
Aug 07 Javascript
layUI实现三级导航菜单效果
Jul 26 #Javascript
layui实现三级联动效果
Jul 26 #Javascript
layui实现三级导航菜单
Jul 26 #Javascript
layui实现左侧菜单点击右侧内容区显示
Jul 26 #Javascript
详解nvm管理多版本node踩坑
Jul 26 #Javascript
layui自定义ajax左侧三级菜单
Jul 26 #Javascript
layui递归实现动态左侧菜单
Jul 26 #Javascript
You might like
php下intval()和(int)转换使用与区别
2008/07/18 PHP
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
PHP7 标准库修改
2021/03/09 PHP
jquery事件机制扩展插件 jquery鼠标右键事件。
2011/12/26 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
2015/01/24 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
Javascript实现时间倒计时功能
2018/11/17 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
[41:54]2018DOTA2亚洲邀请赛 4.1 小组赛A组加赛 TNC vs Liquid
2018/04/03 DOTA
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
Python实现数据库编程方法详解
2015/06/09 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
Ajax请求总共有多少种Callback
2016/07/17 面试题
出国留学担保书
2014/05/20 职场文书
捐资助学感谢信
2015/01/21 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
采购部年度工作总结
2015/08/13 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
JVM之方法返回地址详解
2022/02/28 Java/Android
解决 redis 无法远程连接
2022/05/15 Redis
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL