异步 Node.js 执行顺序

4

processItem何时开始执行? 当一些项目推到队列上时,它是否立即开始执行?还是必须在for循环完成之后,队列上的第一个项目才能开始执行?

var processItem = function (item, callback) {
    console.log(item)
    callback();
}


var myQueue = async.queue(processItem, 2)


for (index = 0; index < 1000; ++index) {
    myQueue.push(index)
}
2个回答

4
简单的回答是,所有的任务都将被添加到队列中,然后以随机(未定义)的顺序执行。

通过https://github.com/caolan/async#queueworker-concurrency获取背景信息。

queue(worker, concurrency)

创建具有指定并发数队列对象。添加到队列中的任务会并行处理(最多达到并发数限制)。如果所有工作者都在工作中,则任务将排队等待,直到有一个可用。一旦工作者完成了一个任务,该任务回调函数就会被调用。


换句话说,顺序是未定义的。如果您需要按特定顺序执行任务,则应使用不同的异步原语,例如series(tasks,[callback])。https://github.com/caolan/async#seriestasks-callback

澄清以涉及实际问题。 - T.W.R. Cole

2
当前调用堆栈必须在任何异步任务运行之前解决。这意味着当前函数必须运行完成(加上调用该函数的任何函数等),然后才能运行任何异步操作。直接回答您的问题:在第一个项目运行之前,所有项目都将完全排队。
您可能会发现阅读有关JavaScript事件循环的更多信息(JavaScript event loop)会有所帮助:异步作业位于事件队列中,逐个处理每个作业。事件队列中的每个作业都会导致调用堆栈的创建(其中堆栈中的每个项都是函数调用--第一个函数在底部,在第一个函数内调用的函数在次底部等)。当堆栈完全清除时,事件循环处理下一个事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接