国产黄色免费网站_久久天天做天天爱综合色_精品国产一区久久久_成人黄色激情网站_久久成人在线视频_美女一区二区在线观看_亚洲精品免费一区亚洲精品免费精品一区 _91精品国产综合久久精品麻豆

Promise 你真的用明白了么?

2020-9-2    seo達(dá)人

前置知識

在開始正文前,我們先把本文涉及到的一些內(nèi)容提前定個基調(diào)。

Promise 哪些 API 涉及了微任務(wù)?

Promise 中只有涉及到狀態(tài)變更后才需要被執(zhí)行的回調(diào)才算是微任務(wù),比如說 then、 catch 、finally ,其他所有的代碼執(zhí)行都是宏任務(wù)(同步執(zhí)行)。

上圖中藍(lán)色為同步執(zhí)行,黃色為異步執(zhí)行(丟到微任務(wù)隊列中)。

這些微任務(wù)何時被加入微任務(wù)隊列?

這個問題我們根據(jù) ecma 規(guī)范來看:

  • 如果此時 Promise 狀態(tài)為 pending,那么成功或失敗的回調(diào)會分別被加入至 [[PromiseFulfillReactions]] 和 [[PromiseRejectReactions]] 中。如果你看過手寫 Promise 的代碼的話,應(yīng)該能發(fā)現(xiàn)有兩個數(shù)組存儲這些回調(diào)函數(shù)。
  • 如果此時 Promise 狀態(tài)為非 pending 時,回調(diào)會成為 Promise Jobs,也就是微任務(wù)。

了解完以上知識后,正片開始。

同一個 then,不同的微任務(wù)執(zhí)行

初級

Promise.resolve()
  .then(() => { console.log("then1"); Promise.resolve().then(() => { console.log("then1-1");
    });
  })
  .then(() => { console.log("then2");
  });

以上代碼大家應(yīng)該都能得出正確的答案:then1 → then1-1 → then2

雖然 then 是同步執(zhí)行,并且狀態(tài)也已經(jīng)變更。但這并不代表每次遇到 then 時我們都需要把它的回調(diào)丟入微任務(wù)隊列中,而是等待 then 的回調(diào)執(zhí)行完畢后再根據(jù)情況執(zhí)行對應(yīng)操作。

基于此,我們可以得出第一個結(jié)論:鏈?zhǔn)秸{(diào)用中,只有前一個 then 的回調(diào)執(zhí)行完畢后,跟著的 then 中的回調(diào)才會被加入至微任務(wù)隊列。

中級

大家都知道了 Promise resolve 后,跟著的 then 中的回調(diào)會馬上進(jìn)入微任務(wù)隊列。

那么以下代碼你認(rèn)為的輸出會是什么?

let p = Promise.resolve();

p.then(() => { console.log("then1"); Promise.resolve().then(() => { console.log("then1-1");
  });
}).then(() => { console.log("then1-2");
});

p.then(() => { console.log("then2");
}); 

按照一開始的認(rèn)知我們不難得出 then2 會在 then1-1 后輸出,但是實際情況卻是相反的。

基于此我們得出第二個結(jié)論:每個鏈?zhǔn)秸{(diào)用的開端會首先依次進(jìn)入微任務(wù)隊列。

接下來我們換個寫法:

let p = Promise.resolve().then(() => { console.log("then1"); Promise.resolve().then(() => { console.log("then1-1");
  });
}).then(() => { console.log("then2");
});

p.then(() => { console.log("then3");
});

上述代碼其實有個陷阱,then 每次都會返回一個新的 Promise,此時的 p 已經(jīng)不是 Promise.resolve() 生成的,而是最后一個 then 生成的,因此 then3 應(yīng)該是在 then2 后打印出來的。

順便我們也可以把之前得出的結(jié)論優(yōu)化為:同一個 Promise 的每個鏈?zhǔn)秸{(diào)用的開端會首先依次進(jìn)入微任務(wù)隊列。

高級

以下大家可以猜猜 then1-2 會在何時打印出來?

Promise.resolve()
  .then(() => { console.log("then1"); Promise.resolve()
      .then(() => { console.log("then1-1"); return 1;
      })
      .then(() => { console.log("then1-2");
      });
  })
  .then(() => { console.log("then2");
  })
  .then(() => { console.log("then3");
  })
  .then(() => { console.log("then4");
  });

這題肯定是簡單的,記住第一個結(jié)論就能得出答案,以下是解析:

  • 第一次 resolve 后第一個 then 的回調(diào)進(jìn)入微任務(wù)隊列并執(zhí)行,打印 then1
  • 第二次 resolve 后內(nèi)部第一個 then 的回調(diào)進(jìn)入微任務(wù)隊列,此時外部第一個 then 的回調(diào)全部執(zhí)行完畢,需要將外部的第二個 then 回調(diào)也插入微任務(wù)隊列。
  • 執(zhí)行微任務(wù),打印 then1-1 和 then2,然后分別再將之后 then 中的回調(diào)插入微任務(wù)隊列
  • 執(zhí)行微任務(wù),打印 then1-2 和 then3 ,之后的內(nèi)容就不一一說明了

接下來我們把 return 1 修改一下,結(jié)果可就大不相同啦:

Promise.resolve()
  .then(() => { console.log("then1"); Promise.resolve()
      .then(() => { console.log("then1-1"); return Promise.resolve();
      })
      .then(() => { console.log("then1-2");
      });
  })
  .then(() => { console.log("then2");
  })
  .then(() => { console.log("then3");
  })
  .then(() => { console.log("then4");
  });

當(dāng)我們 return Promise.resolve() 時,你猜猜 then1-2 會何時打印了?

答案是最后一個才被打印出來。

為什么在 then 中分別 return 不同的東西,微任務(wù)的執(zhí)行順序竟有如此大的變化?以下是筆者的解析。

PS:then 返回一個新的 Promise,并且會用這個 Promise 去 resolve 返回值,這個概念需要大家先了解一下。

根據(jù) Promise A+ 規(guī)范

根據(jù)規(guī)范 2.3.2,如果 resolve 了一個 Promise,需要為其加上一個 then 并 resolve

if (x instanceof MyPromise) { if (x.currentState === PENDING) {
  } else {
    x.then(resolve, reject);
  } return;
}

上述代碼節(jié)選自手寫 Promise 實現(xiàn)。

那么根據(jù) A+ 規(guī)范來說,如果我們在 then 中返回了 Promise.resolve 的話會多入隊一次微任務(wù),但是這個結(jié)論還是與實際不符的,因此我們還需要尋找其他權(quán)威的文檔。

根據(jù) ECMA - 262 規(guī)范

根據(jù)規(guī)范 25.6.1.3.2,當(dāng) Promise resolve 了一個 Promise 時,會產(chǎn)生一個NewPromiseResolveThenableJob,這是屬于 Promise Jobs 中的一種,也就是微任務(wù)。

This Job uses the supplied thenable and its then method to resolve the given promise. This process must take place as a Job to ensure that the evaluation of the then method occurs after evaluation of any surrounding code has completed.

并且該 Jobs 還會調(diào)用一次 then 函數(shù)來 resolve Promise,這也就又生成了一次微任務(wù)。

這就是為什么會觸發(fā)兩次微任務(wù)的來源。

藍(lán)藍(lán)設(shè)計www.newchinaweekly.com )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗 、交互設(shè)計、 網(wǎng)站建設(shè) 平面設(shè)計服務(wù)

日歷

鏈接

個人資料

藍(lán)藍(lán)設(shè)計的小編 http://www.newchinaweekly.com

存檔

亚洲三级在线视频| 精品卡1卡2卡三卡免费网站| 久久午夜鲁丝片| 精品久久久中文字幕人妻| 波兰性xxxxx极品hd| 日韩三级小视频| 国产丰满果冻videossex| 欧美色图另类图片| 中文字幕校园春色| 亚洲电影视频在线| 在线一区二区三区视频| 色综合天天爱| 国产精品456露脸| 一区二区日韩av| 91麻豆精品国产| 婷婷成人综合网| 日韩欧美国产麻豆| 国内精品国产三级国产在线专| 成人欧美一区二区三区在线湿哒哒| 亚洲精品电影在线一区| 中文字幕第80页| 登山的目的在线| 国产91丝袜美女在线播放| 伦av综合一区| 国产极品一区二区三区| 水莓100国产免费av在线播放| 婷婷午夜社区一区| 一区二区三区网站 | 欧美日韩在线看片| 伊人久久大香线蕉综合影院首页| 中老年在线免费视频| 美日韩中文字幕| 六月婷婷色综合| 亚洲va欧美va国产va天堂影院| 亚洲欧洲在线视频| 不卡一区二区三区视频| 欧在线一二三四区| 欧美做爰爽爽爽爽爽爽| 日本免费一二三区| 欧美专区日韩| 一级日本在线| 蜜乳av综合| 成人av在线影院| 日韩精品一区二区三区swag| 国产日韩精品入口| 天堂在线资源视频| 日韩熟女一区二区| 日日摸夜夜添夜夜添毛片av| 波多野一区二区| 欧美日韩破处视频| 欧美做受69| 国产馆精品极品| 欧美日韩aaaaaa| 国产精品久久网| 麻豆三级在线观看| 樱花视频在线免费观看| 初尝黑人巨炮波多野结衣电影| 日韩三级影视| 男女视频一区二区| 精品国产91久久久久久| 午夜精品在线观看| 97国产精东麻豆人妻电影| 在线观看 中文字幕| t66y最新发布地址| 欧美少妇激情| 高清不卡在线观看| 国产婷婷成人久久av免费高清 | 欧美精品入口蜜桃| 丝袜免费视频| 日日狠狠久久| 99九九99九九九视频精品| 亚洲精品中文字幕有码专区| 婷婷四房综合激情五月| 动漫av网站免费观看| 99热在线观看免费精品| 最大av网站| 成人影院天天5g天天爽无毒影院| 国产精品每日更新| 欧美黑人一区二区三区| 亚洲乱码国产一区三区| 国产不卡av在线播放| 黄网页免费在线观看| 亚洲综合不卡| 日韩欧美不卡在线观看视频| 色视频一区二区三区| 久久久久久久久久久网| 欧美黑人孕妇孕交| 日韩理论片av| 欧美伊人久久久久久午夜久久久久| 亚洲最大福利视频网| 国产又粗又长又黄的视频| 天天噜噜噜噜噜噜| 精品国产a一区二区三区v免费| 亚洲一区在线观看免费| 成人中文字幕+乱码+中文字幕| 国产又大又粗又爽的毛片| xxxxxwwww免费视频| 外国成人在线视频| 精品久久久久久久久久| 国产一区二区久久久| 日本在线观看视频网站| 日漫免费在线观看网站| 亚洲深夜av| 日韩av在线免费观看一区| 国产欧美日韩精品在线观看 | 成人影片在线播放| 欧美精品aaaa| 中文字幕av中文字幕| 色婷婷综合久久久中字幕精品久久 | 麻豆传媒视频在线观看免费| 日韩激情视频网站| 久久久成人精品| 中文字幕乱妇无码av在线| www.91av.com| 精品久久久亚洲| 欧美日韩高清影院| 免费看污污视频| 亚洲av无码片一区二区三区| 香蕉成人av| 亚洲女同一区二区| 精品国产乱码久久久久软件| 国产精品久久久久久久久夜色| 少女频道在线观看高清| 91丝袜呻吟高潮美腿白嫩在线观看| 97超级碰碰碰| 欧美三根一起进三p| av在线电影网| 99国产精品久| 亚洲伊人久久大香线蕉av| 天堂中文在线网| 正在播放日韩精品| 午夜一区二区三区视频| 国产又爽又黄ai换脸| 五月天激情开心网| 亚洲精品播放| 亚洲国产精品推荐| 五月天激情播播| 国产一级电影网| 麻豆精品视频在线观看视频| 欧美尤物巨大精品爽| 久久久久久久久久综合| av丝袜在线| 亚洲高清视频中文字幕| 潘金莲一级淫片aaaaaa播放1| sese久久| 欧美fxxxxxx另类| 久久亚洲精品毛片| 三级在线观看免费大全| 黄色成人在线观看| 1024亚洲合集| 亚洲天堂电影网| 国产亚洲精品拍拍拍拍拍| 欧美日韩调教| 欧美激情xxxxx| 日韩成人免费观看| 亚洲精品三区| 精品国产凹凸成av人导航| 中文字幕制服丝袜| 日韩三级电影网| 久久久无码精品亚洲日韩按摩| 在线观看不卡av| 一级黄色录像毛片| 美足av综合网| 久久se精品一区二区| 国产精品电影一区| 影音先锋黄色网址| 日本精品影院| 深夜福利日韩在线看| 永久免费看片视频教学| www视频在线观看| 色噜噜狠狠成人网p站| 男人添女人下面免费视频| 一级二级在线观看| 国产精品丝袜一区| 黄页免费在线观看视频| 国产男女爽爽爽| 91丨九色丨尤物| 400部精品国偷自产在线观看 | 中文字幕日韩在线视频| 久草网视频在线观看| 国产专区精品| 国产一区二区三区在线| 国产午夜精品一区二区理论影院| 99热这里有精品| 中文字幕亚洲第一| 国产视频1区2区| 欧美一区二区三区激情视频| 欧美激情2020午夜免费观看| 日本黄色一级视频| 欧美hentaied在线观看| 奇米成人av国产一区二区三区| 国产xxxx孕妇| 亚洲永久免费精品| 蜜桃导航-精品导航| www.eeuss影院| 中文字幕欧美日韩一区| 国产免费999| 俺来俺也去www色在线观看| 91精品国产91久久综合桃花| 欧美在线视频第一页|