目录一、Promise.all()简介二、async/await实现Promise.all()1、方式一2、方式二三、async/await与Promise.all()结合使用一、P
Promise.all() 方法接收一个 promise 的 iterable 类型(注:Array,Map,Set 都属于 es6 的 iterable 类型)的输入,并且只返回一个Promise实例,并且输入的所有 promise 的 resolve 回调的结果是一个数组。
先定义三个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]
-使用async/await,循环遍历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
该方面类似实现手写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)
}
});
})
}
因为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()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: async/await实现Promise.all()的方式
本文链接: https://lsjlt.com/news/175209.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0