promise并发控制
时间: 2023-07-21 08:59:42 浏览: 119
js代码-promise并发控制
在JavaScript中,可以使用Promise和一些控制流技术来实现并发控制。以下是一种常用的方法,称为"限制并发数":
```javascript
function limitConcurrency(tasks, limit) {
const results = [];
let running = 0;
let index = 0;
function runTask(task) {
running++;
return task().then(result => {
results.push(result);
}).finally(() => {
running--;
runNextTask();
});
}
function runNextTask() {
while (running < limit && index < tasks.length) {
runTask(tasks[index]);
index++;
}
}
return new Promise(resolve => {
const checkCompletion = () => {
if (running === 0) {
resolve(results);
}
};
runNextTask();
// 检查任务是否全部完成
setInterval(checkCompletion, 100);
});
}
```
使用上述`limitConcurrency`函数,可以控制同时执行的Promise任务数量。下面是一个示例,演示如何使用该函数来限制并发数:
```javascript
// 模拟耗时的异步任务
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// 创建一些需要并发执行的任务
const tasks = [
() => delay(2000).then(() => 'Task 1 completed'),
() => delay(3000).then(() => 'Task 2 completed'),
() => delay(1000).then(() => 'Task 3 completed'),
() => delay(4000).then(() => 'Task 4 completed'),
() => delay(2500).then(() => 'Task 5 completed'),
];
// 设置最大并发数为2
const concurrencyLimit = 2;
// 限制并发数执行任务
limitConcurrency(tasks, concurrencyLimit).then(results => {
console.log('All tasks completed:', results);
});
```
在上述示例中,`limitConcurrency`函数限制了同时执行的Promise任务数量为2。根据任务的执行时间和最大并发数,任务将按照限制的并发数逐个执行,并在全部完成后返回结果。
请注意,上述代码仅为示例,可以根据实际需求进行修改和优化。同时,还可以使用其他方式实现并发控制,如使用第三方库(如`async`或`p-limit`)或使用ES6的`async/await`等。
阅读全文