掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
本文轉(zhuǎn)載自微信公眾號「JS每日一題」,作者灰灰。轉(zhuǎn)載本文請聯(lián)系JS每日一題公眾號。

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比薩嘎網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式薩嘎網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋薩嘎地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
在瀏覽器事件循環(huán)中,我們了解到j(luò)avascript在瀏覽器中的事件循環(huán)機(jī)制,其是根據(jù)HTML5定義的規(guī)范來實(shí)現(xiàn)
而在NodeJS中,事件循環(huán)是基于libuv實(shí)現(xiàn),libuv是一個多平臺的專注于異步IO的庫,如下圖最右側(cè)所示:
上圖EVENT_QUEUE 給人看起來只有一個隊(duì)列,但EventLoop存在6個階段,每個階段都有對應(yīng)的一個先進(jìn)先出的回調(diào)隊(duì)列
上節(jié)講到事件循環(huán)分成了六個階段,對應(yīng)如下:
每個階段對應(yīng)一個隊(duì)列,當(dāng)事件循環(huán)進(jìn)入某個階段時, 將會在該階段內(nèi)執(zhí)行回調(diào),直到隊(duì)列耗盡或者回調(diào)的最大數(shù)量已執(zhí)行, 那么將進(jìn)入下一個處理階段
除了上述6個階段,還存在process.nextTick,其不屬于事件循環(huán)的任何一個階段,它屬于該階段與下階段之間的過渡, 即本階段執(zhí)行結(jié)束, 進(jìn)入下一個階段前, 所要執(zhí)行的回調(diào),類似插隊(duì)
流程圖如下所示:
在Node中,同樣存在宏任務(wù)和微任務(wù),與瀏覽器中的事件循環(huán)相似
微任務(wù)對應(yīng)有:
宏任務(wù)對應(yīng)有:
其執(zhí)行順序?yàn)椋?/p>
通過上面的學(xué)習(xí),下面開始看看題目
- 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')
分析過程:
執(zhí)行結(jié)果如下:
- script start
- async1 start
- async2
- promise1
- promise2
- script end
- nextTick1
- nextTick2
- async1 end
- promise3
- setTimeout0
- setImmediate
- setTimeout2
最后有一道是關(guān)于setTimeout與setImmediate的輸出順序
- setTimeout(() => {
- console.log("setTimeout");
- }, 0);
- setImmediate(() => {
- console.log("setImmediate");
- });
輸出情況如下:
- 情況一:
- setTimeout
- setImmediate
- 情況二:
- setImmediate
- setTimeout
分析下流程:
參考文獻(xiàn)
https://segmentfault.com/a/1190000012258592
https://juejin.cn/post/6844904100195205133
https://vue3js.cn/interview/

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流