【发布时间】:2016-10-30 19:16:31
【问题描述】:
在nodejs的官方网站(https://nodejs.org/api/timers.html#timers_setimmediate_callback_arg)里有说:
setImmediate() 函数安排“立即”执行回调 在 I/O 事件的回调之后和由 setTimeout 设置的计时器之前和 setInterval 被触发。
但是在下面的代码中,setTimeout() 函数在 setImmediate() 之前执行。为什么?
setImmediate(function A() {
setImmediate(function B() {
console.log(1);
setImmediate(function D() { console.log(2); });
setImmediate(function E() { console.log(3); });
});
setImmediate(function C() {
console.log(4);
setImmediate(function F() { console.log(5); });
setImmediate(function G() { console.log(6); });
});
});
setTimeout(function timeout() {
console.log('TIMEOUT FIRED');
}, 0)
结果:
超时触发 1 4 2 3 5 6我写了另一个例子,setTimeout 也可以在setImmediate 之前工作。
setTimeout(function timeout() {
console.log('TIMEOUT-1 FIRED');
}, 0)
setTimeout(function timeout() {
console.log('TIMEOUT-2 FIRED');
}, 0)
setImmediate(function D() { console.log(1); });
setImmediate(function D() { console.log(2); });
setImmediate(function D() { console.log(3); });
setTimeout(function timeout() {
console.log('TIMEOUT-1 FIRED');
}, 0)
setTimeout(function timeout() {
console.log('TIMEOUT-2 FIRED');
}, 0)
输出:
TIMEOUT-1 被触发 TIMEOUT-2 已触发 TIMEOUT-1 被触发 TIMEOUT-2 已触发 1 2 3【问题讨论】:
-
在第一个节点 5.6.0 中我得到
1 4 TIMEOUT FIRED 2 3 5 6 -
@metis 您使用的是什么版本的 node.js,因为某些旧版本似乎存在错误:github.com/nodejs/node-v0.x-archive/issues/6034
-
v.4.4.5 是nodejs欢迎页面大部分用户推荐的版本
-
对我来说,最重要的是,依赖于这样的调度特性对于系统设计来说是一个非常脆弱的基础。
-
我认为 Node 应该按照文档说明工作,但 究竟 设计师的意图并不是很清楚,而且很明显行为会有所不同。因此,我不会以依赖于这些 API 的特定平台行为的方式设计自己的软件。
标签: javascript node.js