比如我想依次执行,除了setTimeout,还有什么方式。
|
Archangel_SDYJun 26, 2013
1
|
|
DRcodingJun 26, 2013
2
|
|
slixurdJun 26, 2013
3
全部用回调?
|
|
tangzxJun 26, 2013 via iPhone
4
icedcoffeescript
|
|
5
想省事,直接用async。想学习,自己写个简单的async,原理不难
|
|
6
另外你这个用setTimeout的方法。。不一定能保证依次执行吧。万一其中一个环节执行时间超长
|
|
ijseJun 27, 2013
7
为什么不喜欢setTimeout?
|
|
9
@zhangxiao setTimeout是最能保证依次执行的,而setInterval才不是~
|
|
dorentusJun 27, 2013
10
看你对『依次执行』的要求是什么了。
假如是要『先执行步骤 A,10s 后执行步骤 B,再 5s 后执行步骤 C』这种,那么 setTimeout 就可以胜任: A(); setTimeout(B, 10000); setTimeout(C, 15000); 如果是要『A 执行完毕再执行 B,然后 B 执行完毕再执行 C』,那么就稍微麻烦些,不过用上面大家提到的 async 实现起来应该会简单些。 PS: window.setInterval 和 window.setTimeout 的唯一区别就是重复执行和只执行一次而已。 |
|
11
别忘了js响应事件高于一切和单线程本质,你的语句有时会被drop的。不知async会不会发生。
|
|
12
|
|
13
@heroicYang Mozilla 和 whatwg 的文档里面都没看到有提到这点么……愿闻其详。
|
|
14
@dorentus 假如是要『先执行步骤 A,10s 后执行步骤 B,再 5s 后执行步骤 C』这种,除了setTimeout。还有什么优雅一点的方式吗
|
|
15
@leohxj 你可以基于它实现自己的优雅的 API 或者队列系统,例如类似 jQuery 的这个:http://api.jquery.com/delay/
|
|
zhangxiaoJun 27, 2013
16
@heroicYang 呃。。没理解你的意思,为啥setTimeout可以保证以此执行。。?
|
|
17
@ijse
@heroicYang 其实就是 @dorentus 所说的,要看对依次执行的定义是什么了。如果只是依次触发,那么setTimeout确实可以了。如果是后一个要等前一个完成了再开始,那setTimeout就做不到了 |
|
18
一般来说,事先算出每一步的执行时间,然后在一个循环中分别setTimeout,还要注意闭包问题。原书有bug。
参考JQuery作者写的: 《Pro JavaScript Techniques》 http://book.douban.com/subject/1949853/ 里边有动画的例子。 |
|
heroicYangJun 27, 2013
19
@zhangxiao
@leohxj 只有安排好需要执行的任务,不管其中哪个占用大量时间,用setTimeout都是能保证其按顺序执行的。 当然,如果把任务3的delay time改成比前面任何一个小的话,它肯定是会插入的。 @dorentus 关于setInterval,可以参看下我以前写的一篇拙文,欢迎拍砖~嘿嘿。 http://heroicyang.com/2012/09/06/javascript-timers/ |
|
zhangxiaoJun 27, 2013
20
@heroicYang 嗯,那我们只是对“依次”的定义或者理解不同。我理解LZ的意思是后一个任务要在前一个任务完成之后才开始。你的理解是只要依次触发即可。
|
|
heroicYangJun 27, 2013
21
@zhangxiao 恩,我理解的这种情况用setTimeout就可以了,你理解的情况用async库的waterfall或者series也可以轻松搞定。就看楼主具体的应用场景了~
|
|
heroicYangJun 27, 2013
22
@zhangxiao 另外,我demo中也是前一个任务完了才执行后一个任务的哦。你吧setTimeout的延时全设成0就知道啦,哈哈。
|
|
zhangxiaoJun 27, 2013
23
@heroicYang 这... 那万一有个异步的调用... 你还是得嵌callback才行了...
|
|
heroicYangJun 27, 2013
24
@zhangxiao 哈哈,那就async走起~
|
|
darasionJun 28, 2013
25
转一篇 2009 年的文章:
http://www.laruence.com/2009/09/23/1089.html |
|
bitsmixJun 28, 2013
26
你们这些争论 setTimeout 真的没看过 javascript 秘密花园或者 the good parts 么
|
|
heroicYangJun 28, 2013
27
@bitsmix 我想这里没有人争论吧?大家只是发表下各自的看法~
另,如果我没有记错的话, 《The Good Parts》里是没有讲定时器的~ |
|
DaniloSamJun 30, 2013
28
注意setTimeout是异步的, 并且会受到单线程特性的影响, 所以如果你想精确的10秒后执行, 可能会有惊喜
算出一个函数的执行时间这事儿, 挺二的, 如果在任何环境执行时间都一样, 世界就没好了 可以想一下队列这玩意, 参考nodejs里next()如何实现的(想到而已, 卤煮可以看一下) 如果将你需要按顺序执行的函数 放到一个队列中 每一个执行完都next()一下, 这样根本无需关心某函数的执行时间 而有新的函数需要进入队列, 直接放到队尾即可 |