asynchronousnodejs执行顺序
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) }
简单的答案是你的所有任务将被添加到队列中,然后以随机(未定义)的顺序执行。
背景信息,通过https://github.com/caolan/async#queueworker-concurrency
队列(工作者,并发)
用指定的concurrency
创build一个queue
对象。 添加到队列中的任务将并行处理(达到concurrency
限制)。 如果所有worker
都在进行中,则task
将排队等待,直到有人可用。 一旦一个工作者完成了一个task
,这个task
的callback
被调用。
换句话说,订单是未定义的 。 如果您需要按特定顺序执行任务,则应该使用不同的asynchronous原语,如series(tasks, [callback])
https://github.com/caolan/async#seriestasks-callback
在任何asynchronous任务运行之前,当前调用堆栈必须parsing。 这意味着在任何asynchronous操作运行之前,当前函数必须运行到完成状态(加上任何调用该函数的函数等)。 要直接回答您的问题:所有项目将在第一个项目运行之前完全排队。
阅读关于JavaScript事件循环的更多信息可能会对您有所帮助:asynchronous作业位于事件队列中,并逐个处理它们。 事件队列中的每个作业都会导致创build调用堆栈(其中堆栈中的每个项目都是函数调用 – 第一个函数位于底部,第一个函数内部调用的函数接近底部等) 。 当堆栈被完全清除时,事件循环处理下一个事件。
- 如何在多个其他函数完成后才执行Javascript函数?
- 从多个asynchronousfunction(承诺)收集数据
- 用Node,Express和google Analytics API在callback地狱中丢失
- Express 4的asynchronous包装函数不会捕获错误
- 如何在运行摩卡testing之前等待一个咕噜的任务完成
- 在节点中如何声明全局variables只能用于当前的执行上下文,在asynchronouscallback中不需要?
- 如何确定一个asynchronous调用是否是最后一个
- 如何使用callback来等待两个查询asynchronous节点
- Sails.js如何在async.series()中使用for循环?