我应该如何循环依赖前一个循环的值的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()函数是asynchronous的,我希望它是asynchronous的,但是如果我这样做:

 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可能会在结束之前触发数千次),我会遇到栈限制问题(我是不正确的?)。 我已经看了Promise和其他asynchronous技巧,但他们都看起来继续推动堆栈(我是不正确的?)。

我的堆栈限制假设是不正确的,还是有一些明显的方法来做到这一点,我错过了?

此外,我不能忙 – 等待asynchronousgetValue变成一个同步的getValue,这使用asynchronous的全部目的。

我会达到一个堆栈限制

不,你不会的。 如果它们真的是asynchronous的,那么下一次对iteratGetValue调用将会在一个新的栈帧中 – 起源于asynchronouscallback处理程序的顶层执行上下文中。 Promise是一样的 – 有些甚至要求是asynchronous的。