使用 promise.all() 结合索引映射可以实现异步操作结果的排序。具体做法是将每个 promise 包装为包含原始索引的对象,等待所有任务完成后,根据索引对结果数组进行还原排序。

Promise.all 返回的顺序与输入顺序一致吗
是的,Promise.all 保证返回的数组元素顺序与传入的 Promise 对象数组顺序完全一致,无论各个异步任务的完成时间先后如何。

const p1 = new Promise(resolve => setTimeout(() => resolve(1), 100));
const p2 = new Promise(resolve => setTimeout(() => resolve(2), 50));
const p3 = new Promise(resolve => setTimeout(() => resolve(3), 75));
Promise.all([p1, p2, p3]).then(results => {
console.log(results); // [1, 2, 3]
});如何在 Promise.all 中保留原始位置信息
通过 Array.prototype.map 将原始 Promise 转换为包含索引和值的对象,可以在结果中保留每个任务在输入数组中的原始位置。
立即学习“Java免费学习笔记(深入)”;

const tasks = [
{ id: 'A', promise: fetch('/api/a') },
{ id: 'B', promise: fetch('/api/b') },
{ id: 'C', promise: fetch('/api/c') }
];
const indexedTasks = tasks.map((task, index) => ({
index,
...task
}));
Promise.all(indexedTasks.map(t => t.promise.then(value => ({
index: t.index,
value
}))))
.then(results => results.sort((a, b) => a.index - b.index))
.then(sortedResults => console.log(sortedResults));如果某个异步任务失败会怎样处理
当使用 Promise.all 时,只要有一个 Promise 被拒绝,整个 Promise.all 就会立即拒绝,且不会等待其他任务完成。此时无法获得任何成功任务的结果,除非使用 Promise.allSettled 来捕获所有状态。


















