关于setInterval

2012-06-14 14:54:43 +08:00
 sd4399340
大家有没有碰到这样一种情况,比如:

function test(a,b,c) {
...animation // 很多动画,有的超过2s
...setTimeout(function..., 5000)
}


setInterval(function(){
// a,b,c 随时间变动
test(a,b,c);
},1000)


现在我发现,test()里面的animation并不按顺序来,很混乱,
我想是由于test函数每隔1s执行一次,而test函数本身肯定还没执行完毕,
因为动画需要时间,而且后面还有setTimeout的时间,
所以当一个test还没有执行完时,程序又再次进入test函数,
变量间会不会有冲突?
3279 次点击
所在节点    JavaScript
9 条回复
qiayue
2012-06-14 14:59:51 +08:00
你是想每隔一秒执行一次还是每执行完一次才执行下一次?
sd4399340
2012-06-14 15:19:07 +08:00
@qiayue 我是想每隔1s执行一次啊,但是感觉它并没有按test里动画顺序来
krazy
2012-06-14 15:22:22 +08:00
js的定时器工作原理不是这样的,可以看下这个,里面有幅图很经典
http://ejohn.org/blog/how-javascript-timers-work/
总结一下就是
定时器的那个时间不靠谱。
js是单线程的,异步事件按队列依次执行。
如果定时器被正在执行的代码阻塞了,那么就等到那段代码执行完的合适时机再触发。
qiukun
2012-06-14 15:24:56 +08:00
当一个test还没有执行完时,程序又再次进入test函数,
变量间会不会有冲突?
这个想法太奇葩了,难道 js 是这样奇葩的语言吗?从别的地方去想。我怀疑动画部分操纵的对象被同时操操坏了。(非线程安全?)求专业人士
sd4399340
2012-06-14 15:53:28 +08:00
@qiukun 我也觉得这个想法比较扯淡。。。但是程序执行的结果就像是这样的。。。
js单线程的吧,牵扯到线程安全?
sd4399340
2012-06-14 16:03:16 +08:00
@krazy 这文章不错,谢了,我好好看看~
icyflash
2012-06-14 16:24:54 +08:00
youngershen
2012-06-14 16:39:04 +08:00
楼主搞不清楚setInterval和setTimeout的区别
sd4399340
2012-06-14 16:40:18 +08:00
@youngershen 这个搞得清的,可能是我问题描述的有点奇怪吧。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/39479

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX