在JavaScript中,处理并发异步请求并获取所有结果通常可以通过以下几种方式实现:
Promise.allPromise.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.allSettledPromise.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.racePromise.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:适用于只需要获取第一个完成的异步请求结果的场景。根据你的具体需求选择合适的并发处理方式。