Promise.all() 和 Promise.allSettled() 均是 Promise 的静态方法,区别在于对于 Promise 失败的处理方式不同,Promise.all() 遇到失败会直接抛出异常中止执行,而 Promise.allSettled() 统一返回所有 Promise 的状态和结果。
下面是一个简单的 promiseAll 和 allSelected 的实现:
function promiseAll(promises) {
return new Promise((resolve, reject) => {
const results = [];
let completedCount = 0;
if (promises.length === 0) {
resolve(results);
return;
}
for (let i = 0; i < promises.length; i++) {
promises[i].then(
result => {
results[i] = result;
completedCount++;
if (completedCount === promises.length) {
resolve(results);
}
},
error => {
reject(error);
}
);
}
});
}
function allSelected(promises, conditionFn) {
return promiseAll(promises).then(values => {
if (conditionFn(values)) {
// 执行一些操作
return true;
} else {
throw new Error('Not all promises are fulfilled');
}
});
}
在 promiseAll 实现中,我们首先判断传入的 Promise 数组是否为空,如果是则直接返回一个 resolve 状态的 Promise。然后遍历数组中每个 Promise 对象,并对其使用 then 方法注册成功或失败的回调函数,在成功的情况下将结果保存到一个数组中,全部完成后,将保存结果的数组作为 Promise 对象的返回值 resolve 出去;如果其中有一个 Promise 失败,则直接 reject Promise。
在 allSelected 实现中,我们调用了自定义的 promiseAll 方法来处理 Promise 数组,然后根据条件函数来判断是否满足某些条件,如果满足条件,就执行一些操作;否则,返回一个错误信息。