JavaScript一般如何设置时序?

2013-06-26 22:41:23 +08:00
 leohxj
比如我想依次执行,除了setTimeout,还有什么方式。
3449 次点击
所在节点    JavaScript
28 条回复
Archangel_SDY
2013-06-26 22:50:21 +08:00
DRcoding
2013-06-26 23:14:10 +08:00
slixurd
2013-06-26 23:16:24 +08:00
全部用回调?
tangzx
2013-06-26 23:20:21 +08:00
icedcoffeescript
zhangxiao
2013-06-27 03:36:59 +08:00
想省事,直接用async。想学习,自己写个简单的async,原理不难
zhangxiao
2013-06-27 03:37:59 +08:00
另外你这个用setTimeout的方法。。不一定能保证依次执行吧。万一其中一个环节执行时间超长
ijse
2013-06-27 09:17:03 +08:00
为什么不喜欢setTimeout?
ijse
2013-06-27 09:17:28 +08:00
@zhangxiao 为什么不一定保证依次执行?
heroicYang
2013-06-27 10:12:09 +08:00
@zhangxiao setTimeout是最能保证依次执行的,而setInterval才不是~
dorentus
2013-06-27 12:30:09 +08:00
看你对『依次执行』的要求是什么了。

假如是要『先执行步骤 A,10s 后执行步骤 B,再 5s 后执行步骤 C』这种,那么 setTimeout 就可以胜任:

A();
setTimeout(B, 10000);
setTimeout(C, 15000);

如果是要『A 执行完毕再执行 B,然后 B 执行完毕再执行 C』,那么就稍微麻烦些,不过用上面大家提到的 async 实现起来应该会简单些。

PS: window.setInterval 和 window.setTimeout 的唯一区别就是重复执行和只执行一次而已。
loading
2013-06-27 12:34:37 +08:00
别忘了js响应事件高于一切和单线程本质,你的语句有时会被drop的。不知async会不会发生。
heroicYang
2013-06-27 13:52:25 +08:00
@dorentus 不仅仅是重复执行和只执行一次的区别...

@loading setTimeout就不会drop掉耗时久的任务,setInterval才会~
dorentus
2013-06-27 14:09:52 +08:00
@heroicYang Mozilla 和 whatwg 的文档里面都没看到有提到这点么……愿闻其详。
leohxj
2013-06-27 14:43:44 +08:00
@dorentus 假如是要『先执行步骤 A,10s 后执行步骤 B,再 5s 后执行步骤 C』这种,除了setTimeout。还有什么优雅一点的方式吗
dorentus
2013-06-27 15:11:56 +08:00
@leohxj 你可以基于它实现自己的优雅的 API 或者队列系统,例如类似 jQuery 的这个:http://api.jquery.com/delay/
zhangxiao
2013-06-27 18:41:59 +08:00
@heroicYang 呃。。没理解你的意思,为啥setTimeout可以保证以此执行。。?
zhangxiao
2013-06-27 18:44:38 +08:00
@ijse
@heroicYang
其实就是 @dorentus 所说的,要看对依次执行的定义是什么了。如果只是依次触发,那么setTimeout确实可以了。如果是后一个要等前一个完成了再开始,那setTimeout就做不到了
darasion
2013-06-27 19:54:04 +08:00
一般来说,事先算出每一步的执行时间,然后在一个循环中分别setTimeout,还要注意闭包问题。原书有bug。


参考JQuery作者写的:
《Pro JavaScript Techniques》
http://book.douban.com/subject/1949853/
里边有动画的例子。
heroicYang
2013-06-27 22:27:33 +08:00
@zhangxiao
@leohxj
只有安排好需要执行的任务,不管其中哪个占用大量时间,用setTimeout都是能保证其按顺序执行的。



当然,如果把任务3的delay time改成比前面任何一个小的话,它肯定是会插入的。

@dorentus 关于setInterval,可以参看下我以前写的一篇拙文,欢迎拍砖~嘿嘿。 http://heroicyang.com/2012/09/06/javascript-timers/
zhangxiao
2013-06-27 22:35:54 +08:00
@heroicYang 嗯,那我们只是对“依次”的定义或者理解不同。我理解LZ的意思是后一个任务要在前一个任务完成之后才开始。你的理解是只要依次触发即可。

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

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

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

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

© 2021 V2EX