2013-07-01 36 views
2

的我想要在node.js中做同步版本(简化了可读性):我应该如何循环依赖前一个循环值的异步函数?

var value = null; 
var allValues = []; 
do{ 
    value = getValue(value); //load the next value 
    if(value) allValues.push(value); 
}while(value); 
console.log("Got all values:",allValues); 

的目标是通过所有的值进行迭代,但是除非我传递的当前值getValue函数将简单地返回第一个值(导致无限循环)。

在Node.js的的的getValue()函数是异步的,我希望它是异步的,但是如果我这样做:

var allValues = []; 
function iterateGetValue(value){ 
    if(value){ 
     allValues.push(value); 
     getValue(value,iterateGetValue); 
    }else console.log("Got all values:",allValues); 
} 
getValue(null,iterateGetValue); 

我担心N次迭代下来(的getValue可以发射数千在结束之前)我会遇到一个栈限制问题(我错了吗?)。我已经看过Promises和其他异步技巧,但他们都看起来继续推动堆栈(我错了吗?)。

我的堆栈限制假设是不正确的,还是有一些明显的方法可以做到这一点,我错过了?另外,我不能等待将异步getValue转换为同步getValue,这违背了使用异步的全部目的。

+0

递归调用getValue是正确的方法来做你想做的,你不应该遇到堆栈问题,除非你也会遇到完全迭代版本的内存问题。 – ChrisCM

回答

3

我会打一个堆栈限制

不,你不会的。如果它们真的是异步的,那么下一个对iteratGetValue的调用将在一个新的堆栈帧中 - 起源于异步回调处理程序的顶层执行上下文中。承诺 - some of which甚至要求是异步的。

+0

不知道。谢谢! – Magneon