2012-07-19 51 views
1

当使用async库进行流量控制时,特别是async.forEach如果您需要跳过特定项目,您如何正确执行回调。如何从Node.js中的异步循环返回

例子:

async.forEach(bigCollection, function(item, callback) { 

    if(skipThis) { 
     return callback(); 
     // OR BELLOW IS BETTER?? 
     //return process.nextTick(callback); 
    } 

    db.query(query, callback); 

}, callback); 

在这我不使用process.nextTick(callback)情况下,我的风险运行到堆栈溢出,如果bigCollection太大?而且,如果我确实使用process.nextTick(callback),我是否会破坏我的代码?

我已经习惯了这样做process.nextTick(callback)的方式,但我不太确定这是一个很好的做法。

+1

堆栈溢出?你为什么会遇到这个问题?我看不出第一个解决方案会导致这种情况的原因,而不是第二个解决方案。另一方面,如果你的集合**真的很大,那么就不要再考虑半解决方案,只需将它分成较小的部分并逐一处理(例如,可以将所有内容包装到'async.series'中并运行' async.forEach'在每一块)。 – freakish 2012-07-19 11:19:25

回答

2

我会说没有nextTick就没关系。

async.forEach(bigCollection, function(item, callback) { 
    if(skipThis) { 
     return callback(); 
    } 
    db.query(query, callback); 
}, callback); 

如果bigCollection太大,那么在进入循环之前会发生溢出。