2013-07-01 34 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