js怎么实现异步并行
异步并行实现方法
在JavaScript中实现异步并行操作通常涉及以下几种方法:
Promise.all()
使用Promise.all()可以并行执行多个Promise,并在所有Promise都完成时返回结果数组。若其中一个Promise被拒绝,整个Promise.all()会立即拒绝。
const promise1 = fetch('https://api.example.com/data1');
const promise2 = fetch('https://api.example.com/data2');
const promise3 = fetch('https://api.example.com/data3');
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log(values); // 所有请求结果的数组
})
.catch(error => {
console.error(error); // 任一请求失败时的错误
});
Promise.allSettled()
与Promise.all()不同,Promise.allSettled()会等待所有Promise完成(无论成功或失败),并返回每个Promise的状态和结果。
Promise.allSettled([promise1, promise2, promise3])
.then(results => {
results.forEach(result => {
if (result.status === 'fulfilled') {
console.log(result.value);
} else {
console.error(result.reason);
}
});
});
async/await结合Promise.all()
在async函数中,可以使用await Promise.all()实现并行异步操作。
async function fetchAllData() {
try {
const [data1, data2, data3] = await Promise.all([promise1, promise2, promise3]);
console.log(data1, data2, data3);
} catch (error) {
console.error(error);
}
}
并行循环处理
对于需要并行处理数组中的每个元素的情况,可以结合map()和Promise.all()。
const urls = ['url1', 'url2', 'url3'];
const fetchPromises = urls.map(url => fetch(url));
Promise.all(fetchPromises)
.then(responses => Promise.all(responses.map(res => res.json())))
.then(data => console.log(data));
限制并发数
在某些场景下需要限制并发数,可以使用第三方库(如p-limit)或自定义实现。
const limit = require('p-limit');
const concurrencyLimit = limit(2); // 限制并发数为2
const tasks = [
concurrencyLimit(() => fetch('url1')),
concurrencyLimit(() => fetch('url2')),
concurrencyLimit(() => fetch('url3'))
];
Promise.all(tasks)
.then(results => console.log(results));
注意事项
- 并行操作会同时发起多个请求或任务,需注意资源消耗和速率限制。
- 在Node.js中,文件I/O或CPU密集型任务可以使用
worker_threads实现真正的并行。 - 浏览器环境中,大量并行请求可能会触发HTTP/2的多路复用限制。







