Promise.all

320 阅读2分钟

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 的数据。

注意事项

  1. 所有 Promise 必须完成:Promise.all 只有在所有传入的 Promise 都被解决时才会被解决。如果任何一个 Promise 被拒绝,Promise.all 返回的 Promise 会立即被拒绝,并且拒绝原因是第一个被拒绝的 Promise 的原因。
  2. 顺序保证:Promise.all 返回的数组中,结果的顺序与传入的 Promise 的顺序一致,即使某些 Promise 可能会更早完成。
  3. 短路行为:如果传入的任何一个 Promise 被拒绝,Promise.all 会立即拒绝,不会等待其他 Promise 完成。这意味着如果有多个 Promise 被拒绝,只有第一个被拒绝的 Promise 的错误会被捕获。
  4. 非 Promise 值:如果传入的数组中包含非 Promise 值,这些值会被视为已经解决的 Promise。
  5. 性能考虑:Promise.all 并行执行所有 Promise,因此适用于需要同时执行多个异步操作的场景。但要注意并发请求的数量,尤其是在网络请求中,以避免对服务器造成过大压力。

如果某个请求失败