Javascript 为什么在事件循环外执行setTimeout和setImmediate的顺序不一致?

Javascript 为什么在事件循环外执行setTimeout和setImmediate的顺序不一致?,javascript,node.js,event-loop,libuv,Javascript,Node.js,Event Loop,Libuv,输出: 如您所见,我第一次运行模块时,setImmediate的回调在setTimeout的回调之前首先执行,但第二次运行脚本时,情况正好相反。这与事件循环有关,您可以在该链接中找到关于此的良好文档。 简而言之,setImmediate在轮询阶段之后执行,setTimeout在“timers”阶段执行,因此执行顺序取决于在节点进程中执行的第一个阶段。 如果将setTimeout和setImmediate放入I/O回调(挂起的回调)中,将首先执行setImmediate。(参见下面的代码,该代码

输出:


如您所见,我第一次运行模块时,setImmediate的回调在setTimeout的回调之前首先执行,但第二次运行脚本时,情况正好相反。

这与事件循环有关,您可以在该链接中找到关于此的良好文档。 简而言之,setImmediate在轮询阶段之后执行,setTimeout在“timers”阶段执行,因此执行顺序取决于在节点进程中执行的第一个阶段。 如果将setTimeout和setImmediate放入I/O回调(挂起的回调)中,将首先执行setImmediate。(参见下面的代码,该代码也出现在前面的链接中)

//超时\u vs_immediate.js

setTimeout(() => {
    console.log("In setTimeout");
});

setImmediate(() => {
    console.log("In setImmediate");
});

文档中有一整节讨论了
setImmediate()
setTimeout()
…@PatrickRoberts之间的关系。文档中说,“如果这两个函数都是从主模块中调用的,那么计时将受到进程性能的限制”。有点模糊。为什么它在主模块中时受流程性能的约束,在外部时独立于流程性能?
const fs = require('fs');

fs.readFile(__filename, () => {
  setTimeout(() => {
    console.log('timeout');
  }, 0);
  setImmediate(() => {
    console.log('immediate');
  });
});