async nodejs执行顺序

时间:2014-10-06 20:20:01

标签: node.js asynchronous

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 个答案:

答案 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的更多信息可能会有所帮助:异步作业位于事件队列中,逐个处理它们。事件队列中的每个作业都会导致调用堆栈的创建(其中堆栈中的每个项目都是函数调用 - 第一个函数位于底部,第一个函数调用的函数是从下到底,等等) 。当堆栈完全清除时,事件循环将处理下一个事件。