⼩程序等待⼏秒、_⼩程序—setTimeOut定时器的问
题及解决
背景
实验室需要将项⽬的app搬到的⼩程序上,终于知道为什么程序员是⼿艺⼈了,只要有需求,就要想⽅设法去填充这种需求,去年是⼩程序的元年了可以说,去年冬天⼀个叫跳⼀跳的⼩程序游戏出现在我的中,当时就觉得腾讯是真的⽜⽪。⼀时间很多的软件⼩程序版相继出现,各⼤也开始关联⼩程序。⼩程序相⽐于app,有着独特的优势,其中最⼤的就是没有ios和android平台之分,但是同时也有局限,你给我开发个⼩程序王者荣耀试试。
定时任务
⼩程序API中有两种定时任务
setInterval
setTimeOut
这两者都能实现定时任务,⽐如实现⼀个定时器,但是建议采⽤后者setTimeOut,理由是前者并不精确。详细请参考
setTimeOut⽤法
不多说直接上:
var timerName = setTimeOut(function() {
//循环代码
}, delay)
这⾥在循环代码处做我们需要循环处理的逻辑,delay是延迟的毫秒数,5秒 = 5 * 1000,timerName是返回的定时器名称,有什么⽤,因为要取消这个定时器就需要给需要给出取消的定时器名称
clearTimeOut(timerName)
坑
我有⼀个需求是每五秒获取⼀次位置
startReportHeart() {timeout on t2 timer
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,但是再⼀次印证了那句话,只有实践才是最好的学习⽅式。不要什么从⼊门到精通,你会发现,这些都会让你从⼊门到放弃。
,⽂中通过⽰例代码介绍的⾮常详细,对⼤家的学习或者⼯作具有⼀定的参考学习价值
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论