NodeJS,Async forEachSeries 执行顺序
Posted
技术标签:
【中文标题】NodeJS,Async forEachSeries 执行顺序【英文标题】:NodeJS, Async forEachSeries execution order 【发布时间】:2013-04-03 07:07:31 【问题描述】:只是想了解如何使用 NodeJS 的异步模块。
我有以下代码。
var a1 = [1,2,3,4,5,6,7,8];
async.forEachSeries(a1, function(n1, callback)
console.log(n1);
var a2 = [10,11,12,13,14];
async.forEachSeries(a2, function(n2, callback)
console.log(n1 + " " + n2);
callback();
);
callback();
);
我想把上面代码的过程做成这样打印出来的样子
1
1 10
1 11
1 12
1 13
1 14
2
2 10
2 11
2 12
2 13
2 14
3
3 10
3 11
3 12
3 13
3 14
.....
但我却得到了类似的东西..
1
1 10
2
2 10
1 11
3
3 10
2 11
1 12
....
我该如何解决这个问题?
【问题讨论】:
如果需要同步输出,为什么要异步执行? 嗯。 forEachSeries 不以同步方式执行吗? Node 0.10.3 和 0.8.16 都能在我的 Mac 上产生您想要的输出。您是否将脚本的输出通过管道传输到文件(或另一个程序)?这会改变process.stdout
的行为,因此也会改变console.log
,因此可能会导致不同的输出。并且forEachSeries
是同步的,因为只有在前一次迭代完成后才会调用下一次迭代。
嗯..你是对的。在我的机器上,它实际上也产生了您期望的输出。但我宁愿称它为“按顺序”而不是“同步”。我正在使用节点 0.10.3 btw。
@NilsH 我想这是语义问题 :) 我将其称为同步,因为操作相互依赖,(N+1)
只有在 (N)
完成后才会被调用。
【参考方案1】:
当一切完成时,forEachMethod 也接受一个回调。所以你的代码应该是这样的:
var a1 = [1,2,3,4,5,6,7,8];
async.forEachSeries(a1, function(n1, callback_s1)
console.log(n1);
var a2 = [10,11,12,13,14];
async.forEachSeries(a2, function(n2, callback_s2)
console.log(n1 + " " + n2);
callback_s2();
, function ()
/* Finished the second series, now we mark the iteration of first series done */
callback_s1();
);
);
您的代码中的问题是您假设 async.forEachSeries 是同步的,但事实并非如此。它保证了数组将被同步处理,但函数本身是异步的。
【讨论】:
能否请您扩展“它保证了数组将被同步处理,但函数本身是异步的。”?如果数组的每个元素都是同步处理的,那是不是意味着应用于每个元素的函数也是同步的?? 谢谢!我已经为此苦恼了两个小时。您的回答清除了嵌套异步的回调机制。*以上是关于NodeJS,Async forEachSeries 执行顺序的主要内容,如果未能解决你的问题,请参考以下文章
使用 node.js async forEachSeries 时是不是有“继续”的等效语句?
nodejs 和 async.waterfall 带有 if 条件和条件函数列表。