宏任务包括
微任务队列包括
掘金神图
结合神图,我们可以看到 nodejs 中 Eeventloop 的过程
nodejs 官方也有说明,EventLoop 与浏览器的 EventLoop 更为贴近
console.log('start');
setTimeout(() => { // callback1
console.log(111);
setTimeout(() => { // callback2
console.log(222);
}, 0);
setImmedia(() => { // callback3
console.log(333);
})
process.nextTick(() => { // callback4
console.log(444);
})
}, 0);
setImmedia(() => { // callback5
console.log(555);
process.nextTick(() => { // callback6
console.log(666);
})
})
setTimeout(() => { // callback7
console.log(777);
process.nextTick(() => { // callback8
console.log(888);
})
}, 0);
process.nextTick(() => { // callback9
console.log(999);
})
console.log('end');
如果我们安装的是 node10.0 之前版本,控制台输出,我们会看到答案是这样的
start->end->999->111->777->444->888->555->333->666->222
如果我们用 node10.0 及以上看到的答案
start->end->999->111->444->777->888->666->666->333->222
为什么在最后的 Timer 任务中,setImmedia 要早于 setTimeout 呢?
因为 setImmedia 的回调顺序不是一定的,这要看 setImmedia 所处的队列,setImmedia 在 Time 和 IO 中,回调要先于 Timer Task
为什么执行次数多了,会发现最外层同级的 setImmedia 也早于 setTimeout?
因为 js 中,做不到真正的 0ms 延迟,所以偶尔会看到 setImmedia 早于 setTimeout,不过客观上,setImmedia 在没有处于 Timer Queue 或者 IO Callbacks Queue 中时,会晚于 setTimeout
以上提到的 setTimeout 等,皆是 0ms 返回,用于对比我对 EventLoop 的简浅认知