插件窝 干货文章 JavaScript并发编程:如何正确获取所有异步请求的结果?

JavaScript并发编程:如何正确获取所有异步请求的结果?

Promise error 结果 一个 534    来源:    2025-03-22

在JavaScript中,处理并发异步请求并获取所有结果通常可以通过以下几种方式实现:

1. 使用 Promise.all

Promise.all 方法可以接收一个包含多个 Promise 的数组,并返回一个新的 Promise。这个新的 Promise 在所有输入的 Promise 都成功完成时才会被解决,返回一个包含所有结果的数组。如果其中任何一个 Promise 被拒绝,Promise.all 会立即拒绝,并返回第一个被拒绝的 Promise 的原因。

const fetchData = async (url) => {
  const response = await fetch(url);
  return response.json();
};

const urls = ['https://api.example.com/data1', 'https://api.example.com/data2', 'https://api.example.com/data3'];

Promise.all(urls.map(url => fetchData(url)))
  .then(results => {
    console.log('All data fetched:', results);
  })
  .catch(error => {
    console.error('Error fetching data:', error);
  });

2. 使用 Promise.allSettled

Promise.allSettledPromise.all 类似,但它会等待所有的 Promise 都完成(无论是成功还是失败),并返回一个包含每个 Promise 结果的对象数组。每个对象都有一个 status 属性,表示 Promise 的状态(fulfilledrejected),以及 valuereason 属性,分别表示成功的结果或失败的原因。

Promise.allSettled(urls.map(url => fetchData(url)))
  .then(results => {
    results.forEach((result, index) => {
      if (result.status === 'fulfilled') {
        console.log(`Data ${index + 1}:`, result.value);
      } else {
        console.error(`Error fetching data ${index + 1}:`, result.reason);
      }
    });
  });

3. 使用 async/await 结合 for 循环

如果你需要逐个处理异步请求的结果,可以使用 async/await 结合 for 循环。这种方式允许你在每个请求完成后立即处理结果,而不需要等待所有请求都完成。

const fetchAllData = async (urls) => {
  const results = [];
  for (const url of urls) {
    try {
      const data = await fetchData(url);
      results.push(data);
    } catch (error) {
      console.error(`Error fetching data from ${url}:`, error);
    }
  }
  return results;
};

fetchAllData(urls).then(results => {
  console.log('All data fetched:', results);
});

4. 使用 Promise.race

Promise.race 方法接收一个 Promise 数组,并返回一个新的 Promise。这个新的 Promise 会在数组中的任何一个 Promise 完成(无论是成功还是失败)时立即完成,并返回该 Promise 的结果或原因。

Promise.race(urls.map(url => fetchData(url)))
  .then(result => {
    console.log('First data fetched:', result);
  })
  .catch(error => {
    console.error('Error fetching first data:', error);
  });

总结

  • Promise.all:适用于需要所有异步请求都成功完成的情况。
  • Promise.allSettled:适用于需要处理所有异步请求的结果,无论成功或失败。
  • async/await 结合 for 循环:适用于需要逐个处理异步请求结果的场景。
  • Promise.race:适用于只需要获取第一个完成的异步请求结果的场景。

根据你的具体需求选择合适的并发处理方式。