asynchronous和在nodejsrecursion

快递mongoose开始,我经常需要对collections进行一些批量操作。 然而,它通常涉及callback,这是一个痛苦,如何在nodejs中编码并发。 所以基本上

//given a collection C var i = 0; var doRecursive = function(i){ if(i<C.length){ C[i].callAsync(err,result){ i=+1; return doRecursive(i); } }else{ return done(); } } doRecursive(i); 

现在我不记得什么是最大的堆栈之前,我得到一个与节点stackoverstream,但我想有10000个元素,它不会做。 我想知道是否有其他方法来处理这个问题,如果是的话,它们是什么? 谢谢

如果目标是asynchronous地迭代一个集合,那么有许多控制stream库可用。

一个很好的例子是async和它的reducefunction :

 async.reduce(C, 0, function (memo, item, callback) { item.callAsync(function (err, result) { if (err) { callback(err); } else { callback(null, memo + result); } }); }, function (err, result) { // ... }); 

注意:不清楚你想从doRecursion获得什么值,所以这只是一个例子。

我认为你可以简单地自我迭代,而不是真正的recursion,因为你不钻入深层对象:

 function doRecursive (C, i){ i=i||0; if(i<C.length){ C[i].callAsync(err, function(result){ doRecursive(C, ++i); }); }else{ done(); } }; doRecursive(C); 

如果代码的function与标签一样,这不会创build一个高堆栈。 我本地化C,以便执行更快,并有可能在其他集合上重用。 该模式也可以很容易地推迟它长时间运行的操作,只是通过改变

 doRecursive(C, ++i); 

 setTimeout( doRecursive.bind(this, C, ++i), 50 );