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

JS中Promise.all 與 Promise.race的區(qū)別小結(jié)

 更新時(shí)間:2026年02月24日 09:49:36   作者:發(fā)現(xiàn)一只大呆瓜  
本文主要介紹了JS中Promise.all 與 Promise.race的區(qū)別小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在處理并發(fā)請(qǐng)求時(shí),Promise.allPromise.race 是我們的得力助手。理解它們的底層實(shí)現(xiàn),不僅能幫我們應(yīng)對(duì)面試,更能讓我們?cè)趶?fù)雜的異步場(chǎng)景中游刃有余。本文將帶你從原理出發(fā),手寫(xiě)這兩個(gè)核心方法的 TypeScript 版本。

一、 手寫(xiě) Promise.all

1. 核心作用與邏輯

Promise.all 接收一個(gè) Promise 數(shù)組,并返回一個(gè)全新的 Promise。

  • 成功條件:只有當(dāng)所有子 Promise 都變?yōu)?fulfilled 時(shí),它才返回所有結(jié)果組成的數(shù)組。
  • 失敗條件:只要有一個(gè)子 Promise 變?yōu)?rejected,它就立即返回該失敗原因。

2. 核心思路

  1. 參數(shù)處理:需要將輸入?yún)?shù)轉(zhuǎn)為真正的數(shù)組,并處理非 Promise 類(lèi)型的數(shù)組成員。
  2. 順序保證關(guān)鍵! 由于異步執(zhí)行時(shí)間不同,直接 push 結(jié)果會(huì)導(dǎo)致順序錯(cuò)亂。必須通過(guò)索引 i 來(lái)精確存放結(jié)果。
  3. 計(jì)數(shù)器:判斷 result.length是否等于數(shù)組長(zhǎng)度,從而確定所有結(jié)果是否已返回。

3. 實(shí)現(xiàn)

  function PromiseAll(arr) {
    const promises = Array.from(arr);
    const result = [];
    return new Promise((resolve, rejected) => {
      for (let i = 0; i < promises.length; i++) {
        promises[i]
          .then((res) => {
            result[i] = res;
            if (result.length === promises.length) {
              resolve(result);
            }
          })
          .catch((err) => {
            rejected(err);
          });
      }
    });
  }
  const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1000);
    }, 1000);
  });
  const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(200);
    }, 200);
  });
  const promise3 = new Promise((resolve, reject) => {
    setTimeout(() => {
      reject(300);
    }, 300);
  });

  PromiseAll([promise1, promise2, promise3])
    .then(function (values) {
      console.log('全部成功', values);
    })
    .catch((values) => {
      console.log('有一個(gè)失敗', values);
    });

二、 手寫(xiě) Promise.race

1. 核心作用與邏輯

Promise.race 接收一個(gè) Promise 數(shù)組,其狀態(tài)取決于第一個(gè)改變狀態(tài)(無(wú)論成功還是失?。┑膶?shí)例。

2. 核心思路

  1. 搶跑機(jī)制:遍歷數(shù)組中的每一個(gè) Promise,誰(shuí)先觸發(fā)回調(diào),就用誰(shuí)的結(jié)果來(lái)決議返回的 Promise。
  2. 狀態(tài)鎖定:一旦狀態(tài)改變,后續(xù)的 resolve 或 reject 都會(huì)被忽略(Promise 原生機(jī)制保證了這一點(diǎn))。

3. 實(shí)現(xiàn)

  function PromiseRace(arr) {
    const promises = Array.from(arr);
    return new Promise((resolve, reject) => {
      try {
        for (let i = 0; i < promises.length; i++) {
          Promise.resolve(promises[i]).then(
            // 第一個(gè)成功的結(jié)果,直接resolve新Promise
            (value) => resolve(value),
            // 第一個(gè)失敗的原因,直接reject新Promise
            (reason) => reject(reason)
          );
        }
      } catch (error) {
        // 參數(shù)校驗(yàn)/遍歷出錯(cuò)時(shí),直接reject新Promise
        reject(error);
      }
    });
  }
  const p1 = new Promise((resolve, reject) => {
    setTimeout(() => {
      reject(100);
    }, 100);
  });
  const p2 = new Promise((resolve) => {
    setTimeout(() => {
      resolve(500);
    }, 5000);
  });
  const p3 = new Promise((resolve) => {
    setTimeout(() => {
      resolve(1000);
    }, 1000);
  });
  PromiseRace([p1, p2, p3])
    .then((res) => console.log(`第一個(gè)成功狀態(tài):${res}`, 'success'))
    .catch((err) => console.log(`第一個(gè)失敗狀態(tài):${err}`, 'error'));

三、 總結(jié)與對(duì)比

方法核心關(guān)注點(diǎn)核心難點(diǎn)
Promise.all全員完成且順序一致需使用索引賦值而非 push
Promise.race誰(shuí)快聽(tīng)誰(shuí)的 (Winner-takes-all)處理空數(shù)組及非 Promise 對(duì)象

到此這篇關(guān)于JS中Promise.all 與 Promise.race的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)JS Promise.all Promise.race內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于JavaScript實(shí)現(xiàn)隨機(jī)顏色輸入框

    基于JavaScript實(shí)現(xiàn)隨機(jī)顏色輸入框

    這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)隨機(jī)顏色輸入框的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),需要的朋友參考下吧
    2016-12-12
  • 移動(dòng)端h5屏幕適配方案(使用PostCSS插件)

    移動(dòng)端h5屏幕適配方案(使用PostCSS插件)

    移動(dòng)端屏幕大小不一,要使網(wǎng)頁(yè)能自適應(yīng)不同尺寸的手機(jī)屏幕,而且還要盡可能開(kāi)發(fā)便捷,目前使用最多的還是rem大法,這篇文章主要介紹了移動(dòng)端h5屏幕適配方案的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • js數(shù)組中如何隨機(jī)取出一個(gè)值

    js數(shù)組中如何隨機(jī)取出一個(gè)值

    這篇文章主要介紹了js數(shù)組中如何隨機(jī)取出一個(gè)值,需要的朋友可以參考下
    2014-06-06
  • JS圖片懶加載技術(shù)實(shí)現(xiàn)過(guò)程解析

    JS圖片懶加載技術(shù)實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了JS圖片懶加載技術(shù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • JavaScript數(shù)據(jù)結(jié)構(gòu)Map的使用實(shí)例詳解

    JavaScript數(shù)據(jù)結(jié)構(gòu)Map的使用實(shí)例詳解

    JavaScript中Map是ES6引入的數(shù)據(jù)結(jié)構(gòu),鍵可為任意類(lèi)型,保留插入順序,支持迭代和size屬性,相比對(duì)象更靈活高效,適合復(fù)雜鍵和有序場(chǎng)景,但需注意對(duì)象鍵引用比較及NaN的特殊處理,本文給大家介紹JavaScript數(shù)據(jù)結(jié)構(gòu)Map的使用,感興趣的朋友一起看看吧
    2025-08-08
  • js 文本框里粘貼一個(gè)圖片url并顯示

    js 文本框里粘貼一個(gè)圖片url并顯示

    不錯(cuò)的應(yīng)用,一般用于開(kāi)發(fā)系統(tǒng)中,圖片新聞,直接顯示圖片
    2008-08-08
  • JavaScript中的繼承之類(lèi)繼承

    JavaScript中的繼承之類(lèi)繼承

    在JS中繼承是一個(gè)非常復(fù)雜的話(huà)題,比其他任何面向?qū)ο笳Z(yǔ)言中的繼承都復(fù)雜得多。接下來(lái)通過(guò)本文給大家介紹JavaScript中的繼承之類(lèi)繼承,感興趣的朋友一起看看吧
    2016-05-05
  • JavaScript 未結(jié)束的字符串常量常見(jiàn)解決方法

    JavaScript 未結(jié)束的字符串常量常見(jiàn)解決方法

    做JavaScript的時(shí)候,發(fā)現(xiàn)老是出現(xiàn)錯(cuò)誤:“未結(jié)束的字符串常量”. 自己找了下應(yīng)該是傳參數(shù)的時(shí)候,有特殊字符引起的.網(wǎng)上也找了下,也有好多出現(xiàn)這種情況.做下總結(jié),以方便以后查閱.
    2010-01-01
  • 使用JS將字符串保存成文件到本地(.txt、.json、.md)

    使用JS將字符串保存成文件到本地(.txt、.json、.md)

    工作中有時(shí)需要通過(guò)JavaScript保存文件到本地,下面這篇文章主要給大家介紹了關(guān)于使用JS將字符串保存成文件到本地的相關(guān)資料,分別包括生成.txt、.json、.md等文件,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • javascript實(shí)現(xiàn)類(lèi)似java中g(shù)etClass()得到對(duì)象類(lèi)名的方法

    javascript實(shí)現(xiàn)類(lèi)似java中g(shù)etClass()得到對(duì)象類(lèi)名的方法

    這篇文章主要介紹了javascript實(shí)現(xiàn)類(lèi)似java中g(shù)etClass()得到對(duì)象類(lèi)名的方法,實(shí)例分析了javascript實(shí)現(xiàn)java中g(shù)etClass方法的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07

最新評(píng)論

三江| 通河县| 贵溪市| 门源| 吴桥县| 营山县| 射洪县| 珲春市| 奉贤区| 建平县| 万盛区| 玉溪市| 苗栗县| 基隆市| 株洲县| 建平县| 扎赉特旗| 洞口县| 根河市| 商洛市| 台前县| 连州市| 景德镇市| 宿松县| 盈江县| 益阳市| 黄骅市| 夹江县| 莆田市| 南华县| 鄂伦春自治旗| 宁城县| 青龙| 福州市| 红河县| 灌云县| 东乡族自治县| 湖州市| 甘洛县| 尚志市| 凌海市|