微信小程序—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基本概念初级讲解论坛贴的学习记录
Feb 22 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
Dec 02 Javascript
JS实现根据出生年月计算年龄
Jan 10 Javascript
js实现页面跳转重定向的几种方式
May 29 Javascript
11种ASP连接数据库的方法
Sep 18 Javascript
javascript省市区三级联动下拉框菜单实例演示
Nov 29 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
Mar 30 Javascript
用headjs来管理和加载js 提高网站加载速度
Nov 29 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
Dec 14 Javascript
Angular4 Select选择改变事件的方法
Oct 09 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
Oct 09 Javascript
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
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合并js请求的例子
2013/11/01 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
JavaScript 字符编码规则
2009/05/04 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
JS 创建对象的模式实例小结
2020/04/28 Javascript
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
Python插件机制实现详解
2020/05/04 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
Python中Selenium库使用教程详解
2020/07/23 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
2020/11/20 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
德国最大的服装、鞋子和配件在线商店之一:Outfits24
2019/07/23 全球购物
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
环境工程专业自荐信范文
2014/06/24 职场文书
人事主管岗位职责
2015/02/04 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers