我应该如何循环依赖前一个循环值的异步函数?

时间:2013-07-01 17:11:11

标签: javascript node.js asynchronous

我正在尝试在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,这违背了使用异步的全部目的。

1 个答案:

答案 0 :(得分:3)

  

我会达到堆栈限制

不,你不会。如果它们实际上是异步的,那么对iteratGetValue的下一次调用将在新的堆栈帧中 - 源自异步回调处理程序的顶级执行上下文。对于Promises来说也是如此 - some of which甚至必需是异步的。