Promise.all 是 JavaScript 中用于并行执行多个异步操作的强大工具。它接受一个包含多个 Promise 的可迭代对象(通常是数组),并返回一个新的 Promise。当所有输入的 Promise 都被解决时,返回的 Promise 也会被解决;如果其中任何一个 Promise 被拒绝,返回的 Promise 也会立即被拒绝。
使用方法
基本用法
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then(values => {
console.log(values); // 输出: [3, 42, "foo"]
});
在这个例子中,Promise.all 接受一个包含三个元素的数组,其中两个是 Promise,一个是普通值。Promise.all 会等待所有 Promise 完成,并将所有结果作为一个数组返回。
异步函数示例
function fetchData(url) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`数据来自 ${url}`);
}, 1000);
});
}
async function fetchAllData() {
const urls = ['url1', 'url2', 'url3'];
const promises = urls.map(url => fetchData(url));
try {
const results = await Promise.all(promises);
console.log(results);
} catch (error) {
console.error("发生错误:", error);
}
}
fetchAllData();
在这个例子中,fetchData 模拟了一个异步数据获取操作。fetchAllData 函数使用 Promise.all 并行获取多个 URL 的数据。
注意事项
- 所有 Promise 必须完成:Promise.all 只有在所有传入的 Promise 都被解决时才会被解决。如果任何一个 Promise 被拒绝,Promise.all 返回的 Promise 会立即被拒绝,并且拒绝原因是第一个被拒绝的 Promise 的原因。
- 顺序保证:Promise.all 返回的数组中,结果的顺序与传入的 Promise 的顺序一致,即使某些 Promise 可能会更早完成。
- 短路行为:如果传入的任何一个 Promise 被拒绝,Promise.all 会立即拒绝,不会等待其他 Promise 完成。这意味着如果有多个 Promise 被拒绝,只有第一个被拒绝的 Promise 的错误会被捕获。
- 非 Promise 值:如果传入的数组中包含非 Promise 值,这些值会被视为已经解决的 Promise。
- 性能考虑:Promise.all 并行执行所有 Promise,因此适用于需要同时执行多个异步操作的场景。但要注意并发请求的数量,尤其是在网络请求中,以避免对服务器造成过大压力。