javascript - 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
请您为我澄清一下这些行是如何逐步执行的。
解决方案
此输出的原因是 javascript 的异步特性。
- 您将前 2 个输出设置为超时,执行时间为 0,这使它们仍然等待一个滴答声。
- 接下来,您需要读取文件,这需要一段时间才能完成,因此会延迟回调中函数的执行
- 回调中的第一个 console.log 在回调执行后立即触发,回调中的其余部分遵循代码的第一部分
- 最后,您在底部有 console.log,它首先被执行,因为它没有延迟,并且不需要等到下一个滴答声。
推荐阅读
- .net-core - 积极的 F# 编译器优化是否只发生在引用的依赖项 + 发布配置上?
- elasticsearch - 弹性搜索 - 节点故障
- discord.net - Discord.net 如何提及角色
- powerbi - 是否可以将 2 个或 3 个 SSAS Cube 连接到 Power bi 并创建视图?
- javascript - 位置问题:包含按钮的粘性页脚
- php - 如何使用 PHP 抓取单个linkedin 帖子
- html - 动态 SVG 模式作为背景:可能吗?我举个例子
- c++ - 错误:从 'std::__1::__wrap_iter 没有可行的转换
'到'int' - c - 数组中的二分查找
- javascript - NodeJS API 获取每个类别的 Items 数组