在JavaScript中,处理并发异步请求并获取所有结果通常可以通过以下几种方式实现:
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);
});
Promise.allSettled
Promise.allSettled
与 Promise.all
类似,但它会等待所有的 Promise
都完成(无论是成功还是失败),并返回一个包含每个 Promise
结果的对象数组。每个对象都有一个 status
属性,表示 Promise
的状态(fulfilled
或 rejected
),以及 value
或 reason
属性,分别表示成功的结果或失败的原因。
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);
}
});
});
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);
});
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
:适用于只需要获取第一个完成的异步请求结果的场景。根据你的具体需求选择合适的并发处理方式。