微信小程序—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 相关文章推荐
jquery固定底网站底部菜单效果
Aug 13 Javascript
jquery实现手风琴效果实例代码
Nov 15 Javascript
jQuery简单实现tab选项卡切换效果
Jun 20 Javascript
微信小程序加载更多 点击查看更多
Nov 29 Javascript
Bootstrap 模态框(Modal)插件代码解析
Dec 21 Javascript
js验证手机号、密码、短信验证码代码工具类
Jun 24 Javascript
搭建vue开发环境
Jul 19 Javascript
vue的全局变量和全局拦截请求器的示例代码
Sep 13 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
Sep 28 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
Apr 29 Javascript
js+canvas实现简单扫雷小游戏
Jan 22 Javascript
JS原生实现轮播图的几种方法
Mar 23 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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
2014/04/08 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
万能的php分页类
2017/07/06 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
2018/01/17 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
德国网上花店:Valentins
2018/08/15 全球购物
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
高三家长寄语
2014/04/03 职场文书
《赶海》教学反思
2014/04/20 职场文书
优秀教师事迹材料
2014/12/15 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
安全教育培训制度
2015/08/06 职场文书
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS