微信小程序—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 相关文章推荐
InnerHtml和InnerText的区别分析
Mar 13 Javascript
jQuery select控制插件
Aug 17 Javascript
node.js中使用q.js实现api的promise化
Sep 17 Javascript
javascript简单实现图片预加载
Dec 03 Javascript
获取阴历(农历)和当前日期的js代码
Feb 15 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
AngularJS基础 ng-readonly 指令简单示例
Aug 02 Javascript
jQuery组件easyui对话框实现代码
Aug 25 Javascript
ajax请求data遇到的问题分析
Jan 18 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
Apr 27 Javascript
基于vue-router 多级路由redirect 重定向的问题
Sep 03 Javascript
浅谈JS for循环中使用break和continue的区别
Jul 21 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下打开URL地址的几种方法小结
2010/05/16 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
PHP基于phpqrcode类生成二维码的方法详解
2018/03/14 PHP
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
Javascript基础教程之数据类型 (字符串 String)
2015/01/18 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
Python实现建立SSH连接的方法
2015/06/03 Python
Python语言描述最大连续子序列和
2017/12/05 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
Python实现仿射密码的思路详解
2020/04/23 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
大学生个人实习的自我评价
2014/02/15 职场文书
学校通报表扬范文
2015/05/04 职场文书
python字典的元素访问实例详解
2021/07/21 Python
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers