javascript 中实现异步操作的并行分类,核心在于使用 promise.all() 来等待所有任务完成,并结合 array.prototype.map() 将输入数据映射为 promise 数组。通过这种方式,多个异步操作会同时发起并在后台并行执行,最终根据它们的成功或失败状态进行分类处理:成功的结果归入一类,失败的原因归入另一类。

如何并行执行一组异步请求并收集结果
要并行执行一组异步请求,可以使用 Promise.all() 方法。该方法接收一个可迭代对象(通常是数组),其中包含多个 Promise 实例。当所有 Promise 都 resolve 时,它会返回一个包含所有结果的数组;如果任何一个 Promise reject,它也会立即 reject。为了区分成功和失败的结果,通常结合 try...catch 块或使用 .then() 和 .catch() 链式调用进行捕获。

const urls = ['https://api.example.com/data1', 'https://api.example.com/data2'];
Promise.all(urls.map(url => fetch(url).then(res => res.json())))
.then(results => {
console.log('All successful:', results);
})
.catch(error => {
console.error('At least one failed:', error);
});
上述代码首先定义了一个 URL 数组,然后使用 map 方法将每个 URL 转换为一个 fetch 请求的 Promise。这些 Promise 被传递给 Promise.all。如果所有请求都成功,results 数组将包含按顺序排列的 JSON 数据。如果任何一个请求失败,控制流将跳转到 catch 块,记录错误信息。
如何处理并行操作中部分失败的情况
在实际应用中,我们往往希望即使部分异步操作失败,也能继续处理其他成功的结果。这时可以使用 Promise.allSettled()。它会等待所有 Promise 完成,无论它们是 resolved 还是 rejected,并返回一个描述每个 Promise 状态的数组。这使得我们可以对每个结果进行分类:成功的归为“成功”,失败的归为“失败”。

const promises = [
Promise.resolve(1),
Promise.reject(new Error('Fail')),
Promise.resolve(3)
];
Promise.allSettled(promises)
.then(results => {
const success = results.filter(r => r.status === 'fulfilled').map(r => r.value);
const failure = results.filter(r => r.status === 'rejected').map(r => r.reason);
console.log('Success:', success);
console.log('Failure:', failure);
});
在这个例子中,promises 数组包含三个 Promise,其中一个被拒绝。Promise.allSettled 确保所有 Promise 都被评估。随后,通过过滤和映射,我们将成功和失败的结果分别提取出来。这种方法允许程序在部分失败的情况下依然能够获取到有效的数据,并进行相应的分类处理。
基于 Promise.allSettled 返回的具体结构如何解析
Promise.allSettled 返回的数组中的每个元素都是一个对象,包含 status 属性(值为 'fulfilled' 或 'rejected')以及对应的 value 或 reason 属性。解析这种结构的关键是检查 status 字段,然后根据状态访问相应的值或原因。这种结构化的返回使得分类逻辑非常清晰,无需额外的错误处理机制即可区分成功和失败的操作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











