理解 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 是单线程,朴素地讲,同时只能完成一件事件。如果有耗时的任务,那后续的所有任务都要等待其完成才能执行。 SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。为了避免这种阻塞,引入了事件循环。即,将代码的执行分成一个个很小的阶段(一次循环),每个阶段重复相应的事情,直到所有任务都完成。 一个阶段包含以下部分:
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 参考 |

更多精彩