最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解promise.then,process.nextTick, setTimeout 以及 setImmediate的執(zhí)行順序

 更新時間:2018年11月21日 11:45:23   作者:舞陽侯  
這篇文章主要介紹了詳解promise.then,process.nextTick, setTimeout 以及 setImmediate的執(zhí)行順序

本文介紹了詳解promise.then,process.nextTick, setTimeout 以及 setImmediate的執(zhí)行順序,分享給大家,具體如下:

先舉一個比較典型的例子:

setImmediate(function(){
  console.log(1);
},0);
setTimeout(function(){
  console.log(2);
},0);
new Promise(function(resolve){
  console.log(3);
  resolve();
  console.log(4);
}).then(function(){
  console.log(5);
});
console.log(6);
process.nextTick(function(){
  console.log(7);
});
console.log(8);

這段代碼輸出的正確順序是什么?

答案是:

3 4 6 8 7 5 2 1

在解釋輸出結果之前,我們來看幾個概念:

macro-task: script (整體代碼),setTimeout, setInterval, setImmediate, I/O, UI rendering.

micro-task: process.nextTick, Promise(原生),Object.observe,MutationObserver

第一步. script整體代碼被執(zhí)行,執(zhí)行過程為

  • 創(chuàng)建setImmediate macro-task
  • 創(chuàng)建setTimeout macro-task
  • 創(chuàng)建micro-task Promise.then 的回調(diào),并執(zhí)行script console.log(3); resolve(); console.log(4); 此時輸出3和4,雖然resolve調(diào)用了,執(zhí)行了但是整體代碼還沒執(zhí)行完,無法進入Promise.then 流程。
  • console.log(6)輸出6
  • process.nextTick 創(chuàng)建micro-task
  • console.log(8) 輸出8
  • 第一個過程過后,已經(jīng)輸出了3 4 6 8

第二步. 由于其他micro-task 的 優(yōu)先級高于macro-task。

此時micro-task 中有兩個任務按照優(yōu)先級process.nextTick 高于 Promise。

所以先輸出7,再輸出5

第三步,micro-task 任務列表已經(jīng)執(zhí)行完畢,家下來執(zhí)行macro-task. 由于setTimeout的優(yōu)先級高于setIImmediate,所以先輸出2,再輸出1。

整個過程描述起來像是同步操作,實際上是基于Event Loop的事件循環(huán)

關于micro-task和macro-task的執(zhí)行順序,可看下面這個例子(來自《深入淺出Node.js》):

//加入兩個nextTick的回調(diào)函數(shù)
process.nextTick(function () {
  console.log('nextTick延遲執(zhí)行1');
});
process.nextTick(function () { 
  console.log('nextTick延遲執(zhí)行2');
});
// 加入兩個setImmediate()的回調(diào)函數(shù)
setImmediate(function () {
  console.log('setImmediate延遲執(zhí)行1'); 
  // 進入下次循環(huán) 
  process.nextTick(function () {
    console.log('強勢插入');
  });
});
setImmediate(function () {
  console.log('setImmediate延遲執(zhí)行2'); 
});

console.log('正常執(zhí)行');

運行這段代碼,結果是這樣:

正常執(zhí)行
nextTick延遲執(zhí)行1
nextTick延遲執(zhí)行2
setImmediate延遲執(zhí)行1
setImmediate延遲執(zhí)行2
強勢插入

在新版的Node中,process.nextTick執(zhí)行完后,會循環(huán)遍歷setImmediate,將setImmediate都執(zhí)行完畢后再跳出循環(huán)。所以兩個setImmediate執(zhí)行完后隊列里只剩下第一個setImmediate里的process.nextTick。最后輸出”強勢插入”。

關于優(yōu)先級的另一個比較清晰的版本:

觀察者優(yōu)先級

在每次輪訓檢查中,各觀察者的優(yōu)先級分別是:

idle觀察者 > I/O觀察者 > check觀察者。

idle觀察者:process.nextTick

I/O觀察者:一般性的I/O回調(diào),如網(wǎng)絡,文件,數(shù)據(jù)庫I/O等

check觀察者:setTimeout>setImmediate

總結

  • 同步代碼執(zhí)行順序優(yōu)先級高于異步代碼執(zhí)行順序優(yōu)先級;
  • new Promise(fn)中的fn是同步執(zhí)行;
  • process.nextTick()>Promise.then()>setTimeout>setImmediate。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • js中的bigint類型轉(zhuǎn)化為json字符串時報無法序列化的問題

    js中的bigint類型轉(zhuǎn)化為json字符串時報無法序列化的問題

    JSON序列化指將JSON對象轉(zhuǎn)換為JSON字符串,J實現(xiàn)方式有兩種:一種是調(diào)用JSON對象內(nèi)置的stringify()函數(shù),一種是為對象自定義toJSON()函數(shù),本文重點介紹js中的bigint類型轉(zhuǎn)化為json字符串時報無法序列化的問題,感興趣的朋友一起看看吧
    2024-01-01
  • JS實現(xiàn)橫向輪播圖(中級版)

    JS實現(xiàn)橫向輪播圖(中級版)

    這篇文章主要為大家詳細介紹了JS實現(xiàn)橫向輪播圖的中級版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • uniapp實現(xiàn)可滑動選項卡

    uniapp實現(xiàn)可滑動選項卡

    這篇文章主要為大家詳細介紹了uniapp實現(xiàn)可滑動選項卡,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • TypeScript 中如何限制對象鍵名的取值范圍

    TypeScript 中如何限制對象鍵名的取值范圍

    TypeScript由微軟開發(fā)的自由和開源的編程語言,是一種給 JavaScript 添加特性的語言擴展,接下來通過本文給大家介紹TypeScript 中如何限制對象鍵名的取值范圍,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • js獲取客戶端操作系統(tǒng)類型的方法【測試可用】

    js獲取客戶端操作系統(tǒng)類型的方法【測試可用】

    這篇文章主要介紹了js獲取客戶端操作系統(tǒng)類型的方法,可有效的判斷常見操作系統(tǒng)的類型,包括Windows、MacOS、Unix及Linux等,涉及javascript頁面navigator.userAgent屬性操作技巧,需要的朋友可以參考下
    2016-05-05
  • JS中操作JSON總結

    JS中操作JSON總結

    本篇文章主要是對JS操作JSON進行了總結介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • 分享11個常用JavaScript小技巧

    分享11個常用JavaScript小技巧

    在我們的日常開發(fā)過程中,我們經(jīng)常會遇到數(shù)字與字符串轉(zhuǎn)換,檢查對象中是否存在對應值,條件性操作對象數(shù)據(jù),過濾數(shù)組中的錯誤值,等等這類處理。本文整理出了一些常用的小技巧,希望大家能喜歡
    2022-06-06
  • JS簡單設置下拉選擇框默認值的方法

    JS簡單設置下拉選擇框默認值的方法

    這篇文章主要介紹了JS簡單設置下拉選擇框默認值的方法,涉及javascript針對頁面元素的遍歷、查找及設置技巧,需要的朋友可以參考下
    2016-08-08
  • Javascript?promise.all的用法介紹(簡潔易懂)

    Javascript?promise.all的用法介紹(簡潔易懂)

    這篇文章主要給大家介紹了關于Javascript?promise.all用法的相關資料,Promise.all()方法是一個Promise對象方法,可以將多個Promise實例包裝成一個新的Promise對象,最終返回一個數(shù)組,需要的朋友可以參考下
    2023-07-07
  • javascript實現(xiàn)簡易的計算器功能

    javascript實現(xiàn)簡易的計算器功能

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)簡易的計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

兴义市| 涪陵区| 韶关市| 胶州市| 南阳市| 吉水县| 泰州市| 定日县| 淄博市| 丹巴县| 梁河县| 武穴市| 历史| 龙岩市| 荆门市| 徐水县| 巩义市| 东至县| 巴南区| 明水县| 奉新县| 子洲县| 太原市| 额济纳旗| 萍乡市| 西畴县| 乐陵市| 遂川县| 高陵县| 永川市| 榆社县| 新宁县| 潜江市| 吉木乃县| 清原| 嘉义市| 罗江县| 库伦旗| 兴文县| 都匀市| 屯留县|