事件循环背景
nodejs是基于v8引擎的JavaScript运行时
nodejs是基于libuv实现 异步非阻塞式i/o 操作的。
而事件循环是nodejs解决非阻塞式I/O操作的机制
失常js执行程序为:
1、主线程执行栈全副工作执行结束。(同步工作)
2、查看微工作队列,
2.1 process.nextTick优先级最高,总是最先执行
2.2 Promise的then回调;await 前面的内容
3、查看宏工作队列,提取一次工作推入执行栈,进行执行。
宏工作队列也就是事件循环分为6个阶段:
1.timers阶段 (setTimeout、setInterval)
2.I/O事件回调阶段(I/O callbacks)阶段
3.闲置阶段(idle, prepare):仅零碎外部应用
4.轮询阶段(poll)
5.查看阶段(check):setImmediate()
6.close callbacks阶段:执行close事件回调
例题
例题1
console.log('main');setImmediate(function() { console.log('setImmediate');});new Promise(function(resolve, reject) { resolve();}).then(function() { console.log('promise.then');});1.console.log('main');退出同步队列2.setImmediate(function() { console.log('setImmediate');});退出宏工作中的查看阶段(check)3.promise的回掉退出微工作队列中
例题2
async function async1() { console.log('async1 start') await async2() console.log('async1 end')}async function async2() { console.log('async2')}console.log('script start') // 1.退出同步队列setTimeout(function () { // 2.退出宏工作的timer阶段 console.log('setTimeout0')}, 0)setTimeout(function () { // 3.退出宏工作的timer阶段 console.log('setTimeout2')}, 300)setImmediate(() => console.log('setImmediate')); // 4.退出宏工作的check阶段process.nextTick(() => console.log('nextTick1')); // 5.退出微工作队列async1(); //6.执行async1// 执行async1中的async2// 把await async2()后的内容退出微工作队列process.nextTick(() => console.log('nextTick2'));// 7.退出微工作队列 process.nextTick优先级最高 所以提前new Promise(function (resolve) { console.log('promise1') // 7.退出同步工作 resolve(); console.log('promise2') // 8.退出同步工作}).then(function () { console.log('promise3') // 9.退出微工作}) console.log('script end') // 10.退出同步工作后果如下script startasync1 startasync2promise1promise2script endnextTick1nextTick2async1 endpromise3setTimeout0setImmediatesetTimeout2