我正在尝试在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 :(得分:3)
不,你不会。如果它们实际上是异步的,那么对我会达到堆栈限制
iteratGetValue
的下一次调用将在新的堆栈帧中 - 源自异步回调处理程序的顶级执行上下文。对于Promises来说也是如此 - some of which甚至必需是异步的。