2013-07-12 74 views
4

开始猫鼬我经常需要对集合进行一些批处理操作。 然而,它通常涉及回调,这是一种痛苦,因为在nodejs中如何编码并发。 所以基本上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); 

现在我不记得什么是最大堆,不然我和节点的stackover流,但我有10 000元猜测,它不会做。 我想知道是否有其他方法来处理这个问题,如果是的话,它们是什么? 谢谢

+1

好,异步函数将与堆栈溢出帮助的回调将是一个不同调用堆栈。但是,通过分解成不同的堆栈,它使“返回”变得毫无用处。 –

+1

看看[异步](https://github.com/caolan/async) –

回答

5

如果目标是异步迭代集合,则有许多控制流库可用。

一个很好的例子是async及其reduce function

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得到什么价值,所以这只是用另外的一个例子。

+0

我知道异步。异步是否有一种方法来推广递归,所以递归可以用“漂亮”的方式编写?人们告诉我应该没有递归和异步调用的stackoverflow问题,我需要测试它是肯定的。编辑:我看你使用Async.reduce,有趣,不知道那一个。 – mpm

1

我想你可以简单地自我迭代,而不是真正的递归,因为你不钻入了深刻的对象:

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

doRecursive(C); 

所标示这不会产生如果代码功能的叠高。 我本地化C,以便它执行得更快,并可能在其他集合上重新使用。 模式也可以很容易地推迟它长时间运行的操作,只是通过改变

doRecursive(C, ++i); 

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