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

39次阅读

共计 1592 个字符,预计需要花费 4 分钟才能阅读完成。

事件循环背景

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

正文完
 0