微信小程序—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 相关文章推荐
兼容IE、firefox以及chrome的js获取时间(getFullYear)
Jul 04 Javascript
JavaScript中的splice()方法使用详解
Jun 09 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
Jun 09 Javascript
jQuery操作cookie
Aug 08 Javascript
正则 js分转元带千分符号详解
Mar 08 Javascript
简单快速的实现js计算器功能
Aug 17 Javascript
详解A标签中href=""的几种用法
Aug 20 Javascript
vue axios整合使用全攻略
May 24 Javascript
深入浅析Vue全局组件与局部组件的区别
Jun 15 Javascript
React Native开发封装Toast与加载Loading组件示例
Sep 08 Javascript
Vue安装浏览器开发工具的步骤详解
May 12 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
Apr 26 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实现建立多层级目录的方法
2014/07/19 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
javascript 兼容FF的onmouseenter和onmouseleave的代码
2008/07/19 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
JQueryMiniUI按照时间进行查询的实现方法
2017/06/07 jQuery
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
Vue利用canvas实现移动端手写板的方法
2018/05/03 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
python中的一些类型转换函数小结
2013/02/10 Python
Python程序设计入门(5)类的使用简介
2014/06/16 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
Python while循环使用else语句代码实例
2020/02/07 Python
plt.figure()参数使用详解及运行演示
2021/01/08 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
初三政治教学反思
2014/01/30 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
关于JavaScript轮播图的实现
2021/11/20 Javascript