为什么与在事件循环外执行setTimeout和setImmediate的顺序不一致? [重复]

问题描述 投票:0回答:1
setTimeout(() => {
    console.log("In setTimeout");
});

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

输出:

enter image description here

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

javascript node.js event-loop libuv
1个回答
0
投票

这与事件循环有关,您可以在此链接https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/上找到有关此问题的很好的文档。简而言之,setImmediate在轮询阶段之后执行,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');
  });
});

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.