使用 promise.all() 结合 map() 可以高效地并发执行多个异步操作,并在所有任务完成后返回一个包含结果的数组。由于 promise.all 的返回值顺序与输入 promise 的顺序严格一致,因此无需额外的排序步骤即可实现“合并”后的有序结果。

Promise.all() 如何保持输入顺序
Promise.all() 接收一个可迭代对象(如数组),并返回一个新的 Promise。这个新 Promise 会在所有输入的 Promise 都解决(resolved)后解决,其解析值是一个数组,该数组中的元素顺序与输入数组中 Promise 的顺序完全对应。这意味着即使某个异步任务耗时较长,它对应的结果也会占据数组中原本的位置,不会发生错位。

const tasks = [
fetch('/api/1').then(res => res.json()),
fetch('/api/2').then(res => res.json()),
fetch('/api/3').then(res => res.json())
];
Promise.all(tasks)
.then(results => {
// results[0] 对应 /api/1 的结果
// results[1] 对应 /api/2 的结果
// results[2] 对应 /api/3 的结果
console.log(results);
});
如何处理单个任务失败的情况
如果传入 Promise.all() 的任何 Promise 被拒绝(rejected),整个聚合 Promise 会立即被拒绝,且后续成功的任务结果会被丢弃。这种“全有或全无”的行为在需要保证数据完整性的场景中非常有用,但在某些容错场景下可能需要调整策略。
立即学习“Java免费学习笔记(深入)”;

const tasks = [
Promise.resolve(1),
Promise.reject(new Error('Task 2 failed')),
Promise.resolve(3)
];
Promise.all(tasks)
.then(results => console.log(results))
.catch(err => console.error(err)); // 直接捕获错误,results 不可用
基于 Promise.allSettled() 的具体问题:如何获取部分成功的数据
当希望忽略失败的任务并继续处理其他成功的数据时,可以使用 Promise.allSettled()。它会等待所有任务完成,无论成功还是失败,并返回一个描述每个任务状态的数组。通过过滤出状态为 'fulfilled' 的结果,可以实现更灵活的并发合并逻辑。
const tasks = [
Promise.resolve({ id: 1, value: 'A' }),
Promise.reject(new Error('Timeout')),
Promise.resolve({ id: 2, value: 'B' })
];
Promise.allSettled(tasks)
.then(results => {
const successfulResults = results
.filter(result => result.status === 'fulfilled')
.map(result => result.value);
console.log(successfulResults); // [{ id: 1, value: 'A' }, { id: 2, value: 'B' }]
});


















