promise.all() 会按传入顺序保存结果,即使后传入的任务更早完成。每项任务完成时,把它的值写回输入位置,等所有任务完成后再返回数组。

用快慢任务验证顺序
在支持 Promise 的浏览器控制台运行。
const slow = new Promise(resolve => setTimeout(() => resolve("慢"), 40));
const fast = Promise.resolve("快");
Promise.all([slow, fast]).then(values => console.log(values));输出顺序为慢、快。它反映的是传入位置。
用索引保存每一项结果
下面是只针对普通数组的练习实现。用 Array.from 先固定输入,再给每项绑定对应位置。
立即学习“Java免费学习笔记(深入)”;
function allValues(input) {
const items = Array.from(input);
return new Promise((resolve, reject) => {
const result = new Array(items.length);
let remaining = items.length;
if (remaining === 0) {
resolve(result);
return;
}
items.forEach((item, index) => {
Promise.resolve(item).then(value => {
result[index] = value;
remaining--;
if (remaining === 0) resolve(result);
}, reject);
});
});
}
Promise.resolve 让普通值和 Promise 都能走同一条处理路径。任一项拒绝时,聚合结果会拒绝。
检查空数组和失败场景
运行以下三条,分别检查普通值、空输入和拒绝。
allValues([Promise.resolve(1), 2]).then(console.log);
allValues([]).then(console.log);
allValues([Promise.reject(new Error("failed"))])
.catch(error => console.log(error.message));结果分别为 [1, 2]、[] 和 failed,控制台显示的先后由各条调用决定。聚合拒绝后,其他已开始的任务仍可能继续。


















