async/await實現Promise.all()的方式
一、Promise.all()簡介
Promise.all() 方法接收一個 promise 的 iterable 類型(注:Array,Map,Set 都屬于 ES6 的 iterable 類型)的輸入,并且只返回一個Promise實例,并且輸入的所有 promise 的 resolve 回調的結果是一個數組。
- Promise的 resolve 回調執(zhí)行是在所有輸入的 promise 的 resolve 回調都結束,或者輸入的 iterable 里沒有 promise 了的時候
- Promise的 reject 回調執(zhí)行是只要任何一個輸入的 promise 的 reject 回調執(zhí)行或者輸入不合法的 promise 就會立即拋出錯誤,并且只要有 reject 就會立即拋出的錯誤信息。
二、async/await實現Promise.all()
先定義三個Promise實例對象,并放置于一個數組中
let a = new Promise((res, rej) => { res(1) }).catch(err => console.log(err)) let b = new Promise((res, rej) => { setTimeout(() => { rej(2) }, 2000) }).catch(err => console.log(err)) let c = new Promise((res, rej) => { res(3) }).catch(err => console.log(err)) const arr = [a, b, c]
1、方式一
-使用async/await,循環(huán)遍歷Promise實例對象的數組,并把每個Promise對象的結果放置于一個空數組中。
async function bb() { let arr1 = []; try { for (let i = 0; i < arr.length; i++) { let h = await arr[i] arr1.push(h) } } catch (err) { } return arr1 } bb().then(res => { console.log(res); //[1, undefined, 3] });
undefined
是因為await只處理成功時resolve(),不處理失敗異常,故返回undefined
2、方式二
該方面類似實現手寫Promise.acll(),等await拿到Promise結果然后count加1,知道count的數值等于數值的長度在resolve()
const all = (arr) => { return new Promise((resolve, reject) => { let length = arr && arr.length let count = 0 let result = [] if (!arr || arr.length === 0) { resolve(result) } arr.forEach(async (item, index) => { try { const res = await item result[index] = res count++ if (count === length ) { resolve(result) } } catch (err) { reject(err) } }); }) }
三、async/await與Promise.all()結合使用
因為Promise.all()返回的也是Promise,所以await 后面可以跟Promise.all()
function fn() { return new Promise((resolve, reject) => { resolve(Math.random()) }) } async function asyncFunc() { let result try { result = await Promise.all([fn(), fn()]) console.log(result) } catch (err) { console.log(err, 'err') } return result } asyncFunc().then(res => { console.log(res, 'res') })
到此這篇關于async/await實現Promise.all()的文章就介紹到這了,更多相關async/await實現Promise.all()內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaScript中removeChild 方法開發(fā)示例代碼
這篇文章主要介紹了JavaScript中removeChild 方法開發(fā)示例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08