const tasks = ...
let concurenncy = 2;
let running = 0;
let completed = 0;
let index = 0;
function next() {
while (running < concurenncy && index < tasks.length) {
const task = tasks[index++];
task(() => {
if (completed === tasks.length) {
return finish();
}
completed++;
running--;
next();
});
running++;
}
}
next();
function finish() {
console.log('All tasks are done');
}
字符串
你好,我有一个关于上面代码的问题。任务是我需要执行的异步任务的数组,concurrency是可以并发运行的任务的最大数量。程序开始时,前两个任务从数组中拉出来并执行。在一个任务结束后,该特定任务的回调函数被调用。为什么我需要在回调中再次调用next()方法?如果回调完成,当前next方法中的循环是否会再次检查下一个任务是否应该进行处理?
提前感谢!
2条答案
按热度按时间bf1o4zei1#
为什么我需要在回调中再次调用next()方法?
while
循环只调用前N个任务,其中N是concurrency
的值,然后循环完成,循环退出,因为在您启动concurenncy
任务数量后,running < concurenncy
将不再为真。然后,某个时候,其中一个任务将完成并调用其回调,并且您传递给每个任务的回调将执行。如果您想启动另一个任务,则必须在该回调中再次调用
next()
,因为while
循环已经退出。仅供参考,看起来你对
completed === tasks.length
的检查有问题,因为你在计算刚刚完成的任务之前进行了比较。在比较completed === tasks.length
之前,你不应该做completed++
吗?mhd8tkvw2#
感谢你给出了清晰的答案。所以,这里的while循环只用于开始前N个任务,而每个后续的next()函数调用实际上只启动一个任务,while循环的行为就像if语句,因为每个新任务都会启动自己的下一个函数?
你是绝对正确的关于完成++之前比较.再次感谢你!