首页 > 解决方案 > Node.js 事件循环机制

问题描述

我正在学习 Node.js 中的 Event-Loop 的机制,并且我正在做一些练习,但有一些困惑,如下所述。

const fs = require("fs");

setTimeout(() => console.log("Timer 1"), 0);
setImmediate(() => console.log("Immediate 1"));

fs.readFile("test-file-with-1-million-lines.txt", () => {
  console.log("I/O");

  setTimeout(() => console.log("Timer 2"), 0);
  setTimeout(() => console.log("Timer 3"), 3000);
  setImmediate(() => console.log("Immediate 2"));
});

console.log("Hello");

我希望看到以下输出:

Hello
定时器 1
立即数 1
I/O
定时器 2
立即数 2
定时器 3

但我得到以下输出:

Hello
定时器 1
立即数 1
I/O
立即数 2
定时器 2
定时器 3

请您为我澄清一下这些行是如何逐步执行的。

标签: javascriptnode.jscallbackevent-loop

解决方案


此输出的原因是 javascript 的异步特性。

  • 您将前 2 个输出设置为超时,执行时间为 0,这使它们仍然等待一个滴答声。
  • 接下来,您需要读取文件,这需要一段时间才能完成,因此会延迟回调中函数的执行
  • 回调中的第一个 console.log 在回调执行后立即触发,回调中的其余部分遵循代码的第一部分
  • 最后,您在底部有 console.log,它首先被执行,因为它没有延迟,并且不需要等到下一个滴答声。

推荐阅读