- Promise.all 并发请求(全部完成后处理)
// 使用 fetch 作为示例
function getData(url) {
return fetch(url).then(res => res.json());
}
Promise.all([
getData('/api/user'),
getData('/api/order'),
getData('/api/cart')
])
.then(([user, order, cart]) => {
console.log('用户数据:', user);
console.log('订单数据:', order);
console.log('购物车数据:', cart);
})
.catch(err => {
console.error('其中一个请求失败:', err);
});
特点:
- 所有请求是同时发出的
- 只有全部成功才进入 .then,有一个失败就进入 .catch
- Promise.allSettled(不管成败都处理)
Promise.allSettled([
fetch('/api/user').then(res => res.json()),
fetch('/api/order').then(res => res.json()),
fetch('/api/cart').then(res => res.json())
])
.then(results => {
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`第${index+1}个成功:`, result.value);
} else {
console.error(`第${index+1}个失败:`, result.reason);
}
});
});
特点:
- 不会因为某个失败而中断
- 每个请求的状态都会返回
- 限制并发数(比如同时只能跑 2 个)
// 并发控制工具
async function limitConcurrency(urls, limit) {
const results = [];
const queue = [...urls];
async function worker() {
while (queue.length) {
const url = queue.shift();
try {
const res = await fetch(url).then(r => r.json());
results.push(res);
} catch (err) {
results.push(err);
}
}
}
const workers = Array.from({ length: limit }, worker);
await Promise.all(workers);
return results;
}
// 用法
limitConcurrency(['/api/1', '/api/2', '/api/3', '/api/4'], 2)
.then(res => console.log('结果:', res));
特点:
- 适合需要防止高并发压垮服务器的场景
- 一批批并发执行