【问题标题】:Why is there inconsistency with the order in which setTimeout and setImmediate are executed outside the event loop? [duplicate]为什么在事件循环之外执行 setTimeout 和 setImmediate 的顺序不一致? [复制]
【发布时间】:2019-12-28 08:05:33
【问题描述】:
setTimeout(() => {
    console.log("In setTimeout");
});

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

输出:

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

【问题讨论】:

  • 文档中有一个完整的部分讨论了non-determinism of execution order 之间的setImmediate()setTimeout()...
  • @PatrickRoberts 文档说“如果两者都是从主模块中调用的,那么时间将受到进程性能的限制”。它有点模糊。为什么它在主模块中时受进程性能的约束,而在主模块外时则独立于进程性能?

标签: javascript node.js event-loop libuv


【解决方案1】:

这与事件循环有关,您可以在此链接https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ 找到有关此的良好文档。 简而言之, setImmediate 在 poll 阶段之后执行, setTimeout 在“计时器”阶段执行,因此执行顺序取决于在您的节点进程中执行的第一个阶段。 如果您将 setTimeout 和 setImmediate 放入 I/O 回调(挂起的回调)中,则 setImmediate 将首先执行。 (请参阅下面的代码,该代码也出现在上一个链接中)

// timeout_vs_immediate.js

const fs = require('fs');

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

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 2023-02-03
    • 2020-07-13
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多