JS实现一个并发函数
实现并发函数的几种方法
在JavaScript中实现并发控制可以通过多种方式完成,以下是几种常见的实现方法:
使用Promise.all
Promise.all可以并行执行多个Promise,并在所有Promise完成后返回结果数组。适用于需要同时执行多个异步操作且不关心顺序的场景。
const fetchData = (url) => fetch(url).then(res => res.json());
const concurrentRequests = async (urls) => {
const promises = urls.map(url => fetchData(url));
return Promise.all(promises);
};
// 使用示例
const urls = ['url1', 'url2', 'url3'];
concurrentRequests(urls).then(results => console.log(results));
使用async/await结合循环
通过async/await和循环结构可以实现更灵活的并发控制,例如限制并发数量。
const runConcurrently = async (tasks, concurrencyLimit) => {
const results = [];
const executing = new Set();
for (const task of tasks) {
const p = task().then(res => {
executing.delete(p);
return res;
});
executing.add(p);
results.push(p);
if (executing.size >= concurrencyLimit) {
await Promise.race(executing);
}
}
return Promise.all(results);
};
// 使用示例
const tasks = [() => fetch('url1'), () => fetch('url2')];
runConcurrently(tasks, 2).then(console.log);
使用第三方库
许多第三方库提供了更完善的并发控制功能,如p-limit、async等。
const pLimit = require('p-limit');
const limit = pLimit(3); // 限制并发数为3
const tasks = [
limit(() => fetch('url1')),
limit(() => fetch('url2'))
];
Promise.all(tasks).then(console.log);
使用Worker Threads
对于CPU密集型任务,可以使用Node.js的Worker Threads实现真正的并行执行。
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('message', msg => console.log(msg));
} else {
parentPort.postMessage('Worker task completed');
}
每种方法都有其适用场景,选择哪种取决于具体需求。Promise.all适合简单并行任务,自定义函数适合需要精细控制并发的场景,第三方库可以提供更丰富的功能,Worker Threads则适合CPU密集型任务。







