关于node.js:每日灵魂一问nodejs事件循环

事件循环背景

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 start
async1 start
async2
promise1
promise2
script end
nextTick1
nextTick2
async1 end
promise3
setTimeout0
setImmediate
setTimeout2

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理