Node.js的事件循环如何处理这两段代码?

时间:2017-12-23 23:55:40

标签: javascript node.js settimeout event-loop setimmediate

我正在尝试了解有关Event Loop的Nodejs's official explanation。他们已经为Timers阶段解释了一个例子,但是我无法将它与他们关于setTimeout和setImmediate的解释相匹配。

您能详细解释一下Event Loop为以下代码片段所做的所有步骤/过程/检查吗?

代码1:

setTimeout(() => {
  console.log('timeout');
}, 0);

setImmediate(() => {
  console.log('immediate');
});

代码2:

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

PS1: 在评论中,马克要我解释,哪一部分令人困惑。你走了:

以下是他们的解释摘要for their first example:“当事件循环进入轮询阶段时,它有一个空队列(fs.readFile()尚未完成),因此它将等待ms的数量一直持续到达到最快的计时器的阈值...然后回到计时器阶段并运行其回调“

所以,我理解的是,相应地对于代码1,它应该如下:轮询阶段具有空队列,并且达到时间阈值。所以,首先应该运行setTimeout。然后去检查阶段,应该setImmediate运行。但它的行为并不像这样。为什么?

0 个答案:

没有答案