JS中的異步管控-Promise/async await

Promise是ES6新增的一個(gè)內(nèi)置類
  • 通過new Promise() 我們可以得到一個(gè)Promise實(shí)例,實(shí)例有兩個(gè)屬性
    • PromiseStatus(狀態(tài))
      • 待定(pending): 初始狀態(tài),既沒有被兌現(xiàn),也沒有被拒絕。
      • 已兌現(xiàn)(fulfilled): 意味著操作成功完成。
      • 已拒絕(rejected): 意味著操作失敗。
    • PromiseValue
      • 存放的是Promise的值
new Promise的時(shí)候可以傳一個(gè)executor函數(shù)(可執(zhí)行函數(shù)),執(zhí)行new Promise的時(shí)候會(huì)立刻把它執(zhí)行,函數(shù)有兩個(gè)參數(shù),分別是resolve/reject,這兩個(gè)參數(shù)都是函數(shù),可以在 executor 執(zhí)行的時(shí)候使用,執(zhí)行后分別把Promise實(shí)例的狀態(tài)值改為resolved/rejected,方法傳的參數(shù)則為實(shí)例的Value值
我們所說的Promise的異步指的是resolve/rejected執(zhí)行
  • 執(zhí)行兩個(gè)方法(其中一個(gè))的時(shí)候不僅僅是修改狀態(tài)和值,還要通知then存儲(chǔ)的兩個(gè)回調(diào)函數(shù)中的一個(gè)執(zhí)行
Promise的then鏈機(jī)制:
  • then()中,放兩個(gè)回調(diào)函數(shù),如果實(shí)例的狀態(tài)是resolved,則把第一個(gè)方法執(zhí)行,如果是rejected則把第二個(gè)方法執(zhí)行,參數(shù)為使用resolve/reject方法時(shí)傳的參數(shù)。

  • .then返回的是一個(gè)promise實(shí)例,return的值作為下一個(gè).then時(shí)resolove的參數(shù),.then不論是哪個(gè)回調(diào)函數(shù)執(zhí)行,只要執(zhí)行不報(bào)錯(cuò),返回的promise實(shí)例狀態(tài)都為resolove,除非return了一個(gè)new promise 此時(shí)以return的promise實(shí)例為主

  • then鏈的順延機(jī)制:如果狀態(tài)一但確定,想去執(zhí)行.then注入的某個(gè)方法,但是此方法沒有被注冊(cè),則向下順延(找下一個(gè)then中注冊(cè)的對(duì)應(yīng)方法)

Promse.all/Promise.race

  • 返回一個(gè)的新的promise實(shí)例
  • all等待所有promise實(shí)例都是成功,整體返回的實(shí)例才是成功(都對(duì)整體才是對(duì),只要有一個(gè)假,整體就是假)
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});
// expected output: Array [3, 42, "foo"]
  • race等待最新有返回結(jié)果的promise實(shí)例,此實(shí)例的成功和失敗決定最后的成功和失?。ㄙ惻埽赫l快聽誰的)
const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then((value) => {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// expected output: "two"

async、await是Promise的一個(gè)語法糖:

  • 我們可以將await關(guān)鍵字后面執(zhí)行的代碼,看做是包裹在(resolve, reject) => {函數(shù)執(zhí)行}中的代碼;
  • await的下一條語句,可以看做是then(res => {函數(shù)執(zhí)行})中的代碼;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容