* 定时器(timer): 在这个阶段执行 setTimeout、setInterval的回调函数 * 待定回调(pending callbacks):某些系统操作(如 TCP 错误类型)执行回调 * idle, prepare:仅系统内部使用。 * 轮询(poll):检索新的 I/O 事件; 执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,那些由计时器和 setImmediate() 调度的之外) * 检测(check):setImmediate() 回调函数在这里执行。 * 关闭的回调函数(close callbacks):一些关闭的回调函数,如:socket.on(‘close‘, ...)。
微任务:promise的then函数的回调、queueMicrotask、process.nextTick
宏任务: setTimeout、setInterval、io事件、setImmediate、close事件
执行顺序也和javascript中一致,先执行主线程的任务,然后接着执微任务,微任务执行完成再执行宏任务,具体的执行顺序如下。
微任务队列
next tick queue:process.nextTick
other tick queue:promise的then函数、queueMicrotask
宏任务队列
timer queue: setTimeout、setInterval
poll queue: io事件
check queue: setImmediate
close queue: close事件
了解完nodejs中事件循环的执行顺序之后,一起来看看下面这道面试题
async function async1() { console.log(‘async1 start‘) await async2() console.log(‘async1 end‘) } async function async2() { console.log(‘async2‘) } console.log(‘script start‘) setTimeout(function () { console.log(‘setTimeout0‘) }, 0) setTimeout(function () { console.log(‘setTimeout2‘) }, 300) setImmediate(() => console.log(‘setImmediate‘)); process.nextTick(() => console.log(‘nextTick1‘)); async1(); process.nextTick(() => console.log(‘nextTick2‘)); new Promise(function (resolve) { console.log(‘promise1‘) resolve(); console.log(‘promise2‘) }).then(function () { console.log(‘promise3‘) }) console.log(‘script end‘)
首先声明了 async1 和 async2函数,只有调用才会被放入调用栈中,所以此时不会执行,往下执行输出 "script start"。
setTimeout(() => { console.log("setTimeout"); }, 0); setImmediate(() => { console.log("setImmediate"); });
按照宏任务队列中各任务的执行顺序,setTimeout属于timer queue,setImmediate属于check queue,按理说会先输出setTimeout,但实际情况会是什么样的呢,我们看一下以下输出情况
原文:https://www.cnblogs.com/vigourice/p/15028030.html