理解 Node.js 的 Event loop
Posted 刘哇勇的部落格
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解 Node.js 的 Event loop相关的知识,希望对你有一定的参考价值。
问题考察如下代码,脑回路中运行并输出结果: console.log("1");
setTimeout(function setTimeout1() {
console.log("2");
process.nextTick(function nextTick1() {
console.log("3");
});
new Promise(function promise1(resolve) {
console.log("4");
resolve();
}).then(function promiseThen1() {
console.log("5");
});
setImmediate(function immediate1() {
console.log("immediate");
});
});
process.nextTick(function nextTick2() {
console.log("6");
});
function bar() {
console.log("bar");
}
async function foo() {
console.log("async start");
await bar();
console.log("async end");
}
foo();
new Promise(function promise2(resolve) {
console.log("7");
resolve();
}).then(function promiseThen2() {
console.log("8");
});
setTimeout(function setTimeout2() {
console.log("9");
new Promise(function promise3(resolve) {
console.log("11");
resolve();
}).then(function promiseThen3() {
console.log("12");
});
process.nextTick(function nextTick3() {
console.log("10");
});
}); JS 事件循环JS 是单线程,朴素地讲,同时只能完成一件事件。如果有耗时的任务,那后续的所有任务都要等待其完成才能执行。 为了避免这种阻塞,引入了事件循环。即,将代码的执行分成一个个很小的阶段(一次循环),每个阶段重复相应的事情,直到所有任务都完成。 一个阶段包含以下部分:
Ticks and Phases of the Node.js Event Loop 图片来自 Daniel Khan 的 Medium 博客,见文末 同步代码及上面每个环节结束时都会清空一遍微任务队列,记住这点很重要! 代码执行流程执行的流程是,
另,
示例代码分析Round 1
Round 2
Round 3
Round 4
Round 5
Round 6
Round 7
至此,走完了所有代码。 结果以下是文章开头的结果: 1
async start
bar
7
6
async end
8
2
4
3
5
9
11
10
12
immediate 参考 |
以上是关于理解 Node.js 的 Event loop的主要内容,如果未能解决你的问题,请参考以下文章
定时器setTimeout()和Node.js的Event Loop
[Node.js] Use nodejs-dashboard event loop delay with hrtime()