什么时候该推荐用 setTimeout(fn, 0) 而不是 setImmediate(fn) ?

2014-04-10 23:21:12 +08:00
 jakwings
按照官方文档的说明,这两个 API 是使用两个独立的 event queue 的,而且后者是保证了执行顺序的,除此之外似乎已经没有任何太大的区别。若不考虑将模块移植到浏览器端,那什么时候该用前者呢?
3751 次点击
所在节点    Node.js
9 条回复
jsonline
2014-04-10 23:49:37 +08:00
1. setImmediate 不是标准用法,只在 IE 10+ 和 NodeJS 上实现。

2. setTimeout 0 的即时性不如 setImmediate
setTimeout(fn, 0) can potentially be used, however as it is clamped to 4ms per the HTML spec, it does not make for a suitable polyfill for the natural immediacy of setImmediate.

所以,在浏览器上用前者,在 Node 上用后者。

参考 https://developer.mozilla.org/en-US/docs/Web/API/Window.setImmediate
jsonline
2014-04-10 23:58:13 +08:00
关于 4ms:
Timers can be nested; after five such nested timers, however, the interval is forced to be at least four milliseconds.

参见 http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timers
jakwings
2014-04-11 00:04:14 +08:00
@jsonline 谢了~
我看到有人在纯 NodeJS 的模块里用 setTimeout 而不是 setImmediate 感觉有点奇怪,所以好奇会不会是因为两者分别占两个 event queue 会有什么特别的用途。看来 NodeJS 是该坚持用 setImmediate 了。
yyfearth
2014-04-11 00:24:03 +08:00
@jakwings setImmediate 是新支持的 所以NodeJS 里面有setTimeout不奇怪
jakwings
2014-04-11 01:53:04 +08:00
@yyfearth 嗯,发现 0.8.x 不支持。
yangff
2014-04-11 08:46:39 +08:00
话说我一般用process.nextTick哎?
jakwings
2014-04-11 09:08:57 +08:00
@yangff process.nextTick 有更专门的用途,我觉得用来取代 setImmediate 有点大材小用了……
yangff
2014-04-18 08:13:39 +08:00
@jakwings 球详细?
PS:v2ex的推送延迟有点高啊。。
jakwings
2014-04-18 08:37:57 +08:00
@yangff nextTick 会让回调函数在当前线程的下一个事件回调函数被调用前执行。这样我们就可以在链式风格的函数调用中即时绑定任务,然后再为任务提供回调函数,而且不怕任务在提供回调函数之前就开始执行。
http://nodejs.org/api/process.html#process_process_nexttick_callback

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

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

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

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

© 2021 V2EX