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 条件和条件函数列表。

nodejs 和 async.waterfall 带有 if 条件和条件函数列表。

nodejs异步调用async

async.map 不会在 nodejs 中调用回调

NodeJs的async