我被 node 的以下段落弄糊涂了.js文档.
setImmediate()
vssetTimeout()
... 计时器的执行顺序将根据调用它们的上下文而有所不同.如果两者都是从主模块内调用的,那么时间将受到进程性能的限制(这可能会受到机器上运行的其他应用程序的影响).
例如,如果我们运行以下不在输入/输出周期内的脚本(即主模块),则两个计时器的执行顺序是不确定的,因为它受进程性能的约束:
接下来显示以下示例
// timeout_vs_immediate.js
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
$ node timeout_vs_immediate.js
timeout
immediate
$ node timeout_vs_immediate.js
immediate
timeout
我不明白是什么使结果不确定.既然timers
阶段发生在check
阶段之前,那么setTimeout
调度的回调不应该总是在setImmediate
调度的回调之前执行吗?我认为事件循环中的阶段顺序不会因为上下文切换或其他原因而改变.
该文件还指出
但是,如果在一个输入/输出周期内移动两个调用,则立即回调始终首先执行:
好的,但是什么使所谓的"输入/输出周期"与主模块不同呢?
我知道有很多相关的问题,但所有的答案都只是通过引用文献来陈述这个事实,而没有解释非决定论在哪里起作用,所以我不认为这是一个重复.