hello, 大家好,我是前端学长Joshua。
热心于做开源,写文章,目的为帮助在校大学生,刚入职场的小伙伴可以尽快搭建自己的前端学习体系。
如果你有学习上的困惑,欢迎关注我,找我交流,我实时回复大家。
Promise.all(promisesArrayOrIterable)
是javascript中的一个辅助函数。它可以帮助我们一次,并行处理多个promise, 然后将结果聚合到一个数组里边,这是聚合结果,不是说返回结果哦。
它实际上是返回一个promise对象。
参数:promise数组
const allPromise = Promise.all([promise1, promise2, ...]);
然后你可以通过 .then
来获取到 Promise.all(promisesArrayOrIterable)
处理之后的聚合结果
allPromise.then(values => {
values; // [valueOfPromise1, valueOfPromise2, ...]
}).catch(error => {
error; // rejectReason of any first rejected promise
});
或者是使用async / await
语法:
try {
const values = await allPromise;
values; // [valueOfPromise1, valueOfPromise2, ...]
} catch (error) {
error; // rejectReason of any first rejected promise
}s
关于 Promise.all() 中,最有趣的点就是,对于参数中,promise被 resolve / 被 reject 的处理方式。
所以,Promise.all()的特点,记住三个词就可以了:
并行 聚合结果 快速失败
在进入例子之前,我们先来写两个辅助函数:
resolveTimeout(value, delay):回返回一个promise对象,这个promise对象会延迟一段时间之后,触发 resolve
rejectTimeout(reason, delay):回返回一个promise对象,这个promise对象会延迟一段时间之后,触发 reject
function resolveTimeout(value, delay) {
return new Promise(
resolve => setTimeout(() => resolve(value), delay)
);
}
function rejectTimeout(reason, delay) {
return new Promise(
(r, reject) => setTimeout(() => reject(reason), delay)
);
}
const allPromise = Promise.all([
resolveTimeout(['potatoes', 'tomatoes'], 1000),
resolveTimeout(['oranges', 'apples'], 1000)
]);
// wait...
const lists = await allPromise;
// after 1 second
console.log(lists);
// [['potatoes', 'tomatoes'], ['oranges', 'apples']]
从代码中,我们可以知道:
const allPromise = Promise.all([
resolveTimeout(['potatoes', 'tomatoes'], 1000),
rejectTimeout(new Error('Out of fruits!'), 1000)
]);
try {
// wait...
const lists = await allPromise;
} catch (error) {
// after 1 second
console.log(error.message); // 'Out of fruits!'
}
从代码中,我们可以知道:
async function myPromiseAll (arr) {
const resultArr = [];
for (let i = 0; i < arr.length; i ++) {
try {
const data = await arr[i];
resultArr.push(data); // promise被reaolve, push 到 resultArr中
} catch (e) {
throw e; // 只要有一个被reject(就是触发错误), 马上抛出错误
}
}
return resultArr;
}
Promise.all(...) 是一个有用的辅助函数,它允许您使用快速失败策略中,并行执行异步操作,并将结果聚合到一个数组中。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。