Javascript 我应该如何循环使用依赖于上一个循环的异步函数';s值多少?

Javascript 我应该如何循环使用依赖于上一个循环的异步函数';s值多少?,javascript,node.js,asynchronous,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中尝试执行的同步版本(为了可读性而简化):

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可能在到达末尾之前触发数千次)会遇到堆栈限制问题(我是不是错了?)。我已经研究过承诺和其他异步技巧,但在我看来,它们似乎都在继续推动堆栈(我错了吗?)

我的堆栈限制假设是否不正确,或者是否有一些明显的方法可以做到这一点,但我没有做到

另外,我迫不及待地想将异步getValue转换为同步getValue,这违背了使用异步的全部目的

我将达到堆栈限制


不,你不会的。如果它们真的是异步的,那么对
iteratGetValue
的下一个调用将在一个新的堆栈框架中-源自异步回调处理程序的顶级执行上下文。承诺也是一样,甚至要求是异步的。

递归调用getValue是做你想做的事情的正确方法,你不应该遇到堆栈问题,除非你在完全迭代的版本中也会遇到内存问题。我不知道这一点。谢谢