【问题标题】:async nodejs execution order异步nodejs执行顺序
【发布时间】:2014-10-08 03:51:22
【问题描述】:

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)
}

【问题讨论】:

    标签: node.js asynchronous


    【解决方案1】:

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


    背景信息,来自https://github.com/caolan/async#queueworker-concurrency

    队列(工作者,并发)

    使用指定的concurrency 创建一个queue 对象。添加到队列的任务是并行处理的(最高可达concurrency 限制)。如果所有workers 都在进行中,则task 将排队,直到有一个可用。一旦工作人员完成了task,就会调用taskcallback


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

    【讨论】:

    • 澄清与实际问题有关
    【解决方案2】:

    当前调用堆栈必须在任何异步任务运行之前解析。这意味着在运行任何异步操作之前,当前函数必须运行完成(加上调用该函数的任何函数等)。直接回答您的问题:所有项目将在第一个运行之前完全排队。

    阅读有关JavaScript event loop 的更多信息可能会对您有所帮助:异步作业位于事件队列中,在那里它们被一一处理。事件队列中的每个作业都会导致调用堆栈的创建(堆栈中的每个项目都是函数调用——第一个函数在底部,在第一个函数中调用的函数是从下到下,等等) .当堆栈完全清除后,事件循环处理下一个事件。

    【讨论】:

      猜你喜欢
      • 2012-04-01
      • 1970-01-01
      • 2017-11-14
      • 2013-03-15
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多