使用 promise.all() 可以按输入顺序合并所有 promise 的结果,而 promise.race() 则返回最先完成的那个结果。开发者通常根据业务需求选择:若需等待全部任务成功才处理数据,应使用 promise.all();若只需最快响应或实现超时控制,则使用 promise.race()。

Promise.all() 如何处理并发请求
Promise.all() 接收一个可迭代对象(如数组),当所有内部 Promise 都变为 fulfilled 时,它才会以相同顺序返回一个包含所有结果的数组。如果其中任何一个 Promise 被 rejected,整个 Promise.all() 会立即 reject,并抛出第一个失败的原因。

const p1 = new Promise(resolve => setTimeout(() => resolve('A'), 100));
const p2 = new Promise(resolve => setTimeout(() => resolve('B'), 50));
Promise.all([p1, p2]).then(results => {
console.log(results); // ['A', 'B']
});上述代码中,尽管 p2 比 p1 先完成,但输出数组的顺序严格对应输入数组的顺序,即 ['A', 'B']。这确保了在并行执行多个异步操作后,开发者能准确地将结果与原始请求对应起来。
立即学习“Java免费学习笔记(深入)”;
Promise.race() 如何实现超时控制
Promise.race() 同样接收一个可迭代对象,但它会在任何一个内部 Promise 改变状态(无论是 fulfilled 还是 rejected)时立即改变自身状态,并返回该 Promise 的结果。这一特性常被用于实现超时机制。

const fetchWithTimeout = (url, timeout) => {
const timeoutPromise = new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), timeout)
);
return Promise.race([fetch(url), timeoutPromise]);
};
fetchWithTimeout('/api/data', 3000).catch(err => console.error(err.message));在这个示例中,如果 fetch 请求在 3000 毫秒内未完成,timeoutPromise 将触发 rejection,导致整个 race 失败。这使得开发者能够优雅地处理网络延迟或无响应的情况,而不需要手动轮询或设置复杂的定时器逻辑。
当 Promise.all() 遇到单个失败时会发生什么
当 Promise.all() 中的某个 Promise 被 rejected 时,它会立即停止等待其他 Promise,并将控制权交给 catch 块。此时,其他尚未完成的 Promise 可能仍在后台运行,但它们的返回值将被忽略。
const pFail = new Promise((_, reject) => setTimeout(() => reject('Error'), 100));
const pSuccess = new Promise(resolve => setTimeout(() => resolve('OK'), 200));
Promise.all([pSuccess, pFail]).catch(err => console.log(err)); // 'Error'在上述代码中,即使 pSuccess 最终会成功,但由于 pFail 先被 reject,Promise.all() 直接捕获了错误。这种“短路”行为在处理强依赖关系的任务时非常有用,但在需要部分成功的情况下,可能需要结合 Promise.allSettled() 来确保所有结果都被收集。


















