async/await實(shí)現(xiàn)Promise.all()的方式
一、Promise.all()簡(jiǎn)介
Promise.all() 方法接收一個(gè) promise 的 iterable 類型(注:Array,Map,Set 都屬于 ES6 的 iterable 類型)的輸入,并且只返回一個(gè)Promise實(shí)例,并且輸入的所有 promise 的 resolve 回調(diào)的結(jié)果是一個(gè)數(shù)組。
- Promise的 resolve 回調(diào)執(zhí)行是在所有輸入的 promise 的 resolve 回調(diào)都結(jié)束,或者輸入的 iterable 里沒有 promise 了的時(shí)候
- Promise的 reject 回調(diào)執(zhí)行是只要任何一個(gè)輸入的 promise 的 reject 回調(diào)執(zhí)行或者輸入不合法的 promise 就會(huì)立即拋出錯(cuò)誤,并且只要有 reject 就會(huì)立即拋出的錯(cuò)誤信息。
二、async/await實(shí)現(xiàn)Promise.all()
先定義三個(gè)Promise實(shí)例對(duì)象,并放置于一個(gè)數(shù)組中
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實(shí)例對(duì)象的數(shù)組,并把每個(gè)Promise對(duì)象的結(jié)果放置于一個(gè)空數(shù)組中。
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是因?yàn)閍wait只處理成功時(shí)resolve(),不處理失敗異常,故返回undefined
2、方式二
該方面類似實(shí)現(xiàn)手寫Promise.acll(),等await拿到Promise結(jié)果然后count加1,知道count的數(shù)值等于數(shù)值的長(zhǎng)度在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()結(jié)合使用
因?yàn)镻romise.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') })到此這篇關(guān)于async/await實(shí)現(xiàn)Promise.all()的文章就介紹到這了,更多相關(guān)async/await實(shí)現(xiàn)Promise.all()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
layui 實(shí)現(xiàn)加載動(dòng)畫以及非真實(shí)加載進(jìn)度的方法
今天小編就為大家分享一篇layui 實(shí)現(xiàn)加載動(dòng)畫以及非真實(shí)加載進(jìn)度的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JavaScript 懸浮窗口實(shí)現(xiàn)代碼
主要是window.onscroll的運(yùn)用2009-02-02
sortable中el-table拖拽及點(diǎn)擊箭頭上下移動(dòng)row效果
這篇文章主要介紹了sortable中el-table拖拽及點(diǎn)擊箭頭上下移動(dòng)row效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08
JavaScript中AOP的實(shí)現(xiàn)與應(yīng)用
這篇文章主要給大家介紹了關(guān)于JavaScript中AOP的實(shí)現(xiàn)與應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
javascript fullscreen全屏實(shí)現(xiàn)代碼
用了實(shí)現(xiàn)打開一個(gè)滿屏的代碼2009-04-04

