2014-12-05 26 views
0

我需要處理相當大數量的條目(數萬個),其功能如async.eachasync.eachSeriesasync.whilst在`async`中實現了一個非遞歸功能嗎?

幾乎還原劑說,我使用async因爲我打算爲每個條目調用一些查詢,使代碼異步。

不幸的是,使用async的函數,調用堆棧消耗得相當快,導致RangeError: Maximum call stack size exceeded

有沒有辦法來調整async以防止這個問題?迭代實現可以解決這個問題。任何替代庫,考慮到這個問題?

這裏是一個示例代碼段,顯示該問題:

異步=要求(「異步」);

a = [] 
for(i = 0; i < 10000000; i++) { 
    a[i] = i; 
} 

async.eachSeries(a,function(element,callback) { 
    console.log(element); 
    callback(); 
},function(err){ 
    if(err){ 
     console.log("error:",err); 
    } 
    console.log("finished."); 
}); 
+0

不,但通過使用自己的堆棧,通常可以重新遞歸遞歸方法。提供更多的代碼,我會提供一個答案... – spender 2014-12-05 15:50:31

+0

這是腳本的代碼,對不起,如果它有點凌亂,它正在進行重構:http://nopaste.info/ca0c118591.html – fstab 2014-12-05 15:54:29

回答

0

你在找什麼是tail recursion。檢查這個問題:What is tail recursion?

+1

我正在使用'async',所以我不是那個應該實現這個的人。我不認爲'async'使用尾遞歸。 – fstab 2014-12-05 15:53:48

+0

@fstab所以,你傳遞給'async'的函數不是遞歸的? – IProblemFactory 2014-12-05 16:15:37

+0

本身不是,但是,例如,它通過'async.whilst'遞歸,通過組合多個函數 – fstab 2014-12-05 16:19:58