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)
}
答案 0 :(得分:4)
简单的答案是,所有任务都将添加到队列中,然后以随机(未定义)顺序执行。
背景信息,来自https://github.com/caolan/async#queueworker-concurrency
使用指定的queue
创建concurrency
对象。添加到队列的任务将并行处理(最多concurrency
限制)。如果所有worker
都在进行中,则task
会排队,直到有一个可用。一旦工作人员完成task
,就会调用task
callback
。
换句话说,订单是未定义。如果您要求以特定顺序执行任务,则应使用其他异步原语,例如series(tasks, [callback])
https://github.com/caolan/async#seriestasks-callback
答案 1 :(得分:2)
当前调用堆栈必须在任何异步任务运行之前解析。这意味着在运行任何异步操作之前,当前函数必须运行完成(以及调用该函数的任何函数等)。直接回答您的问题:在第一个项目运行之前,所有项目都将完全排队。
阅读有关JavaScript event loop的更多信息可能会有所帮助:异步作业位于事件队列中,逐个处理它们。事件队列中的每个作业都会导致调用堆栈的创建(其中堆栈中的每个项目都是函数调用 - 第一个函数位于底部,第一个函数调用的函数是从下到底,等等) 。当堆栈完全清除时,事件循环将处理下一个事件。