国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Promise原理分析二

OnlyMyRailgun / 3053人閱讀

摘要:原理分析一說明方法返回一個(gè)被拒絕的對象。實(shí)現(xiàn)創(chuàng)建一個(gè)新的對象,通過其構(gòu)造函數(shù)的參數(shù)函數(shù)對象將狀態(tài)變?yōu)椤:褪褂媒馕鲋担瑫r(shí)通過構(gòu)造函數(shù)的參數(shù)的函數(shù)對象觸發(fā)的狀態(tài)轉(zhuǎn)變,其中使用數(shù)組記錄返回值使用索引值以確保其返回值在結(jié)果集中的順序。

Promise原理分析二

前面我們分析了Promise的thencatch方法,接下來我們一起來看看rejectresolveraceall方法的實(shí)現(xiàn)。

Note:

Promise原理分析一

reject 說明

Promise.reject(reason)方法返回一個(gè)被拒絕的Promise對象。

語法

Promise.reject(new Error("something wrong")).then(null, err => {
  // todo
});

Promise.reject(new Error("something wrong")).catch(err => {
  // todo
});

參數(shù)

name desc
reason 被拒絕的原因。
實(shí)現(xiàn)

創(chuàng)建一個(gè)新的Promise對象,通過其構(gòu)造函數(shù)的參數(shù)reject函數(shù)對象將狀態(tài)變?yōu)?b>rejected。

static reject(reason) {
  return new Promise((resovle, reject) => {
    reject(reason);
  });
}
resolve 說明

Promise.resolve(value)方法返回一個(gè)以給定值解析后的Promise對象。但如果這個(gè)值是個(gè)Promise對象,返回的Promise會(huì)采用它的最終狀態(tài);否則以該值為成功狀態(tài)返回promise對象。

語法

Promise.resolve(1000).then(value => {
  // todo
});

參數(shù)

name desc
value 用來解析待返回Promise對象的參數(shù)。(可以是一個(gè)Promise對象)
實(shí)現(xiàn)

如果是一個(gè)Promise對象,直接返回該值;否則創(chuàng)建一個(gè)新的Promise對象,通過其構(gòu)造函數(shù)的參數(shù)resolve函數(shù)對象將狀態(tài)變?yōu)?b>fulfilled。

static resolve(value) {
  // 如果為Promise對象,直接返回當(dāng)前值
  if (value instanceof Promise) {
    return value;
  }

  return new Promise(resovle => {
    resovle(value);
  });
}
race 說明

Promise.race(values)返回一個(gè)Promise對象,這個(gè)Promise在values中的任意一個(gè)Promise被解決或拒絕后,立刻以相同的解決值被解決或以相同的拒絕原因被拒絕。

語法

Promise.race([p1, p2]).then(value => {
  // todo
}, reason => {
  // todo
});

參數(shù)

name desc
values 一個(gè)Array對象。
實(shí)現(xiàn)

使用Promise.resolve對迭代對象值進(jìn)行解析,且將新Promise的參數(shù)resolvereject函數(shù)對象傳遞給then方法,以觸發(fā)新Promise對象的狀態(tài)轉(zhuǎn)換。

static race(values) {
  // 校驗(yàn)values參數(shù)是否為數(shù)組
  if (!isArray(values)) {
    return Promise.reject(new Error("Promise.race must be provided an Array"));
  }

  return new Promise((resovle, reject) => {
    values.forEach(value => {  // 遍歷迭代對象
      // 使用Promise.resolve解析value值(可能為Promise對象或其他值)
      // 將新Promise對象的resolve, reject傳遞給解析后的Promise.prototype.then
      Promise.resolve(value).then(resovle, reject);
    });
  });
}
all 說明

Promise.all(values)方法返回一個(gè)Promise對象,該P(yáng)romise會(huì)等values參數(shù)內(nèi)的所有值都被resolve后才被resolve,或以values參數(shù)內(nèi)的第一個(gè)被reject的原因而被reject。

語法

Promise.all([p1, p2]).then(values => {
  // todo
});

參數(shù)

name desc
values 一個(gè)Array對象。
實(shí)現(xiàn)

通過Promise.resolve對迭代對象值進(jìn)行解析,使用數(shù)組記錄values參數(shù)的所有值被解析后的結(jié)果,當(dāng)所有值解析后resolve,并傳遞其所有解析結(jié)果。同時(shí)傳遞reject函數(shù)對象給Promise.resolve().then參數(shù),以觸發(fā)新Promise對象的狀態(tài)轉(zhuǎn)換。

static all(values) {
  // 校驗(yàn)values參數(shù)是否為數(shù)組
  if (!isArray(values)) {
    return Promise.reject(new Error("Promise.all must be provided an Array"));
  }

  return new Promise((resolve, reject) => {
    // 如果數(shù)組長度為0,直接resolve且結(jié)束處理
    if (values.length === 0) {
      resolve([]);
      return;
    }

    const len = values.length;
    // 創(chuàng)建一個(gè)數(shù)組用來保存values的Promise返回值
    const result = new Array(len);
    let remaining = len;

    // 處理values數(shù)組中的值
    function doResolve(index, value) {
      Promise.resolve(value).then(val => {
        // 將解析后的Promise返回值保存在對應(yīng)索引的結(jié)果集中
        result[index] = val;

        // 當(dāng)values的所有值都解析完后,調(diào)用新Promise對象的resolve函數(shù)方法,
        // 把所有返回值result傳遞給后續(xù)處理中,且將狀態(tài)轉(zhuǎn)換為fulfilled。
        if (--remaining === 0) {
          resolve(result);
        }
      }, reject);
    }

    // 迭代values對象,傳遞其索引位置以確保結(jié)果值的順序
    for (let i = 0; i < len; i++) {
      doResolve(i, values[i]);
    }
  });
}
總結(jié)

Promise.rejectPromise.resolve通過Promise的構(gòu)造函數(shù)實(shí)現(xiàn)狀態(tài)轉(zhuǎn)變。

Promise.racePromise.all使用Promise.resolve解析values值,同時(shí)通過構(gòu)造函數(shù)的executor參數(shù)的函數(shù)對象觸發(fā)Promise的狀態(tài)轉(zhuǎn)變,其中Promise.all使用數(shù)組記錄返回值、使用索引值以確保其返回值在結(jié)果集中的順序。

關(guān)鍵知識(shí)點(diǎn)

Promise

MDN

資源 完整代碼

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/80845.html

相關(guān)文章

  • Promise原理分析

    摘要:原理分析一對象用于異步計(jì)算。它有兩個(gè)參數(shù),分別為在成功和失敗情況下的回調(diào)函數(shù)。實(shí)現(xiàn)根據(jù)當(dāng)前狀態(tài)對回調(diào)函數(shù)進(jìn)行處理,同時(shí)返回一個(gè)新的對象,以便鏈?zhǔn)秸{(diào)用。,注冊回調(diào)函數(shù)到當(dāng)前的對象中或,立即執(zhí)行回調(diào)函數(shù)說明方法只處理被拒絕的情況,并返回一個(gè)。 Promise原理分析一 Promise對象用于異步計(jì)算。一個(gè)Promise對象代表著一個(gè)還未完成,但預(yù)期將來會(huì)完成的操作。 Note: Promi...

    WilsonLiu95 評論0 收藏0
  • 原理剖析(第 011 篇)Netty之服務(wù)端啟動(dòng)工作原理分析(下)

    摘要:原理剖析第篇之服務(wù)端啟動(dòng)工作原理分析下一大致介紹由于篇幅過長難以發(fā)布,所以本章節(jié)接著上一節(jié)來的,上一章節(jié)為原理剖析第篇之服務(wù)端啟動(dòng)工作原理分析上那么本章節(jié)就繼續(xù)分析的服務(wù)端啟動(dòng),分析的源碼版本為二三四章節(jié)請看上一章節(jié)詳見原理剖析第篇之 原理剖析(第 011 篇)Netty之服務(wù)端啟動(dòng)工作原理分析(下) - 一、大致介紹 1、由于篇幅過長難以發(fā)布,所以本章節(jié)接著上一節(jié)來的,上一章節(jié)為【原...

    Tikitoo 評論0 收藏0
  • promise/deferred 模式原理分析和實(shí)現(xiàn)

    摘要:三模式模式其實(shí)包含兩部分和。六化在編碼的時(shí)候,想要用進(jìn)行異步操作流程控制,就要將當(dāng)前的異步回調(diào)函數(shù)封裝成。 一、什么是promise/deferred 模式 promise/deferred 模式是,根據(jù)promise/A 或者它的增強(qiáng)修改版promise/A+ 規(guī)范 實(shí)現(xiàn)的promise異步操作的一種實(shí)現(xiàn)方式。 異步的廣度使用使得回調(diào),嵌套出現(xiàn),但是一但出現(xiàn)深度的嵌套,就會(huì)讓codi...

    gclove 評論0 收藏0
  • javascript引擎執(zhí)行的過程的理解--執(zhí)行階段

    摘要:如果對語法分析和預(yù)編譯,還有疑問引擎執(zhí)行的過程的理解語法分析和預(yù)編譯階段。參與執(zhí)行過程的線程分別是引擎線程也稱為內(nèi)核,負(fù)責(zé)解析執(zhí)行腳本程序的主線程例如引擎。以上便是引擎執(zhí)行宏任務(wù)的整個(gè)過程。一、概述 js引擎執(zhí)行過程主要分為三個(gè)階段,分別是語法分析,預(yù)編譯和執(zhí)行階段,上篇文章我們介紹了語法分析和預(yù)編譯階段,那么我們先做個(gè)簡單概括,如下: 1、語法分析: 分別對加載完成的代碼塊進(jìn)行語法檢驗(yàn),語...

    Achilles 評論0 收藏0
  • javascript引擎執(zhí)行的過程的理解--執(zhí)行階段

    摘要:如果對語法分析和預(yù)編譯,還有疑問引擎執(zhí)行的過程的理解語法分析和預(yù)編譯階段。參與執(zhí)行過程的線程分別是引擎線程也稱為內(nèi)核,負(fù)責(zé)解析執(zhí)行腳本程序的主線程例如引擎。以上便是引擎執(zhí)行宏任務(wù)的整個(gè)過程。 一、概述 js引擎執(zhí)行過程主要分為三個(gè)階段,分別是語法分析,預(yù)編譯和執(zhí)行階段,上篇文章我們介紹了語法分析和預(yù)編譯階段,那么我們先做個(gè)簡單概括,如下: 1、語法分析: 分別對加載完成的代碼塊進(jìn)行語法...

    SnaiLiu 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<