JS手寫Promise.all方法

測試例子

 var f11 = Promise.resolve("111");var f22 = Promise.resolve("222");var f33 = Promise.resolve("333");// var f33 = Promise.reject("333");

1、用原生 Promise 實現

邏輯說明:接收一個由多個promise方法組成的數組,異步按數組順序調用。
如果全部成功
成功計數變量+1,
將成功的promise返回值插入到臨時數組中,
(調用的數量 == 成功的數量) 則把臨時數組返回。
如果有一個失敗則程序終止并拋出錯誤的promise結果,前面成功的不輸出

      function promiseAll(arr) {return new Promise((resolve, reject) => {let fullLen = 0; // 成功數量let resArr = []; // 存儲成功的結果for (let i = 0; i < arr.length; i++) {arr[i].then((val) => {fullLen++; // 成功數量+1resArr[i] = val; // 把結果存儲到臨時數組中// 成功的數量 和 傳入數量一致代表全部都成功了,將存儲結果數組返回出去if (fullLen == arr.length)  resolve(resArr);},// 如果其中一個promise錯誤則返回錯誤信息并終止循環,同時在它前面成功的promise返回值都不返回(reson) => reject(reson) );}});}// 測試promiseAll([f11, f22, f33]).then((val) => {console.log(val, "res"); //打印 [111, 222, 333]}).catch((rej) => {console.log(rej, "rej");});

2、用async await 實現

邏輯說明:
初始一個存儲數組
將數組中每個promise成功返回的值插入到resArr中,循環完將數組返回出去。
如果其中一個錯誤,則拋出報錯的promise原因。
提示:for of 是取數組元素的value,for in則是key(常考面試題)
示例:arr 等同于 [ 0:f11, 1:f22, 2:f33 ] ,所以循環中的promis就是f11,f22,f33。即數組元素的value,下標則是key。

      async function promiseAll(arr) {try {let resArr = [];for (let promis of arr) {resArr.push(await promis);}return resArr; } catch (error) {return error;}}// 測試promiseAll([f11, f22, f33]).then((val) => {console.log(val, "res"); //打印 [111, 222, 333]}).catch((rej) => {console.log(rej, "rej");});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213762.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp開發小程序-pc端小程序下載后端接口的二進制流文件

fileName包含文件名后綴名&#xff0c;比如test.png這種格式 api.DownloadTmtFile后端接口返回的是文件的二進制流 值得注意的是&#xff0c;微信開發者工具中是測試不了wx.saveFileToDisk的&#xff0c;需要真機或者體驗版測試 handleDownload(fileName) {if (!fileName) retu…

mysql表的字段建議加上NOT NULL約束

mysql的列加上NOT NULL約束&#xff0c;這是一個好的實踐&#xff08;但不是一個強制要求&#xff09;&#xff0c;因為它能帶來一些好處&#xff0c;例如&#xff1a; 設置為NOT NULL&#xff0c;可以確保該列沒有NULL值&#xff0c;對該列的數據的規范性進行約束。加上NOT N…

大文件傳輸軟件和傳統軟件的優缺點

在當前信息時代&#xff0c;文件和數據的傳輸已成為我們工作和生活中不可或缺的一環。無論是向同事發送報告還是與朋友分享電影&#xff0c;我們都需要依賴軟件完成這些操作。然而&#xff0c;隨著文件和數據容量的增大&#xff0c;傳統的文件傳輸軟件如FTP、HTTP、SMB、NFS等已…

pycharm中py文件設置參數

在py文件中右鍵 直接對應復制進去即可

sql35(Leetcode1204最后一個能進入巴士的人)

代碼&#xff1a; from t1,t2 自連接 兩兩組合 group by having 求和 選出<1000的項 # Write your MySQL query statement below select a.person_name from Queue a, Queue b where a.turn>b.turn group by a.person_id having sum(b.weight)<1000 order by a.t…

Android:The emulator process for AVD Pixel_2_API_29 was killed

The emulator process for AVD Pixel_2_API_29 was killed 報錯描述&#xff1a; 第一次安裝Android studio好不容易解決gradle啟動模擬器又出現了以下錯誤 The emulator process for AVD Pixel_2_API_29 was killed原因一&#xff1a; 需要安裝Intel x86 Emulator Acceleer…

開啟AI時代產品管理新篇章——寫給產品經理的一本跨界書

在數字化時代&#xff0c;產品經理的角色和能力要求不斷演變。徐修建所著的《搜廣推策略產品經理——互聯網大廠搜索廣告推薦案例》恰逢其時&#xff0c;為新時代的產品經理提供了寶貴的指南。 首先&#xff0c;它通過通俗易懂的語言和生動案例&#xff0c;成功揭示了互聯網大廠…

Linux-----find命令

一、find命令 find介紹&#xff1a; ???find是可以通過文件名稱、類型、大小、權限屬性、時間戳等條件在指定目錄下查找對應文件或者目錄的工具&#xff1b;還可以配合相關命令對匹配到的文件作出后續處理。 二、工作原理及特點 find在查找文件時會遍歷指定的目錄&#xff…

基于conda環境使用mamba/conda安裝配置QIIME 2 2023.9 Amplicon擴增子分析環境,q2cli主要功能模塊介紹及使用

QIIME 2 2023.9 Amplicon Distribution介紹&#xff1a; 概述 qiime團隊專門針對高通量擴增子序列分析退出的conda集成環境&#xff0c;包括了主要和常見的擴增子分析模塊&#xff0c;用戶可以單獨使用各個模塊&#xff0c;也可以使用各模塊組成不同的分析流程。從2023.09版本…

外匯天眼:掌握這個技巧,你也能成為交易高手

在金融市場這個大潮中&#xff0c;外匯交易因其高杠桿、24小時交易等特點吸引著無數交易者。然而成功的交易并非易事&#xff0c;對于投資者來說&#xff0c;外匯交易市場是一個復雜且多變的市場&#xff0c;要在外匯市場中獲得成功就需要扎實的外匯金融基礎知識和獨特的策略&a…

RocketMQ - Spring Cloud Alibaba RocketMQ

Spring Cloud Stream是Spring Cloud體系內的一個框架&#xff0c;用于構建與共享消息傳遞系統連接的高度可伸縮的事件驅動微服務&#xff0c;其目的是簡化消息業務在Spring Cloud應用中的開發。 Spring Cloud Stream的架構圖如下所示&#xff0c;應用程序通過Spring Cloud Str…

論文閱讀《Domain Generalized Stereo Matching via Hierarchical Visual Transformation》

論文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/html/Chang_Domain_Generalized_Stereo_Matching_via_Hierarchical_Visual_Transformation_CVPR_2023_paper.html 概述 立體匹配模型是近年來的研究熱點。但是&#xff0c;現有的方法過分依賴特定數據集上…

五年制專轉本備考沖刺階段,老師給你六點建議助你上岸

1、熱衷的不是學習&#xff0c;而是思考 人與人之間最大的差別在于思維的差別&#xff0c;也可以說是思考的差別。專轉本也是如此&#xff0c;有人思考得簡單&#xff0c;有人思考得復雜&#xff1b;有人想得全面&#xff0c;有人想得膚淺。 只有善于思考&#xff0c;才會對問…

100:ReconFusion: 3D Reconstruction with Diffusion Priors

簡介 官網 少樣本重建必然導致nerf失敗&#xff0c;論文提出使用diffusion模型來解決這一問題。從上圖不難看出&#xff0c;論文一步步提升視角數量&#xff0c;逐步與Zip-NeRF對比。 實現流程 Diffusion Model for Novel View Synthesis 給定一組輸入圖像 x o b s { x i…

Jmeter beanshell編程實例

1、引言 BeanShell是一種小型的&#xff0c;免費的&#xff0c;可嵌入的符合Java語法規范的源代碼解釋器&#xff0c;具有對象腳本語言特性。 在Jmeter實踐中&#xff0c;由于BeanShell組件較高的自由度&#xff0c;通常被用來處理較為復雜&#xff0c;其它組件難以處理的問題…

c語言:文件操作(1)

前言&#xff1a;為什么要使用文件 使用文件可以讓程序在不同運行之間保存和讀取數據。這樣可以實現持久化存儲&#xff0c;即使程序關閉后數據也不會丟失。文件也可以用于數據交換&#xff0c;允許不同程序之間共享信息。在 C 語言中&#xff0c;文件還可以用于讀取配置信息&…

系統架構設計師教程(三)信息系統基礎知識

信息系統基礎知識 3.1 信息系統概述3.1.1 信息系統的定義3.1.2 信息系統的發展3.1.3 信息系統的分類3.1.4 信息系統的生命周期3.1.5 信息系統建設原則3.1.6 信息系統開發方法 3.2 業務處理系統 (TPS)3.2.1 業務處理系統的概念3.2.2 業務處理系統的功能3.2.3 業務處理系統的特點…

Python:核心知識點整理大全13-筆記

目錄 6.4.3 在字典中存儲字典 6.5 小結 第7章 用戶輸入和while循環 7.1 函數 input()的工作原理 7.1.1 編寫清晰的程序 7.1.2 使用 int()來獲取數值輸入 7.1.3 求模運算符 7.1.4 在 Python 2.7 中獲取輸入 7.2 while 循環簡介 7.2.1 使用 while 循環 往期快速傳送門…

基于jsonrpc4j實現JSON-RPC over HTTP(客戶端多種調用方式)

1.說明 前文基于jsonrpc4j實現JSON-RPC over HTTP(服務端集成Spring Boot)&#xff0c; 介紹了JSON-RPC over HTTP服務端的實現方法&#xff0c; 并且通過Postman工具調用服務端對外提供的方法&#xff0c; 下面介紹兩種基于Java代碼調用客戶端的方法&#xff1a; 非Spring框…

什么是https 加密協議?

什么是https 加密協議&#xff1f; 加密通信的作用加密原理數字證書SSL/TLS 協議部署和使用重要性 HTTPS&#xff08;Hyper Text Transfer Protocol Secure&#xff09;是一種網絡傳輸協議&#xff0c;它是基于HTTP協議的擴展&#xff0c;通過加密通信內容來保障數據傳輸的安全…