2015-07-28 29 views
1

我正在使用請求庫。我有一組URL(var資源),我想用這些URL的文本內容填充。JavaScript:如何確保此函數僅返回完全填充的數組?

我的代碼如下所示:

var resources = [<URL_1>, <URL_2>, <URL_3>, ...]; 
var resourcesText = resourceToText(resources); 

function resourcesToText(resources) { 
    var text = []; 

    for (var i in resources) { 
    request(resources[i], fetch); 
    } 

    function fetch(error, response, body) { 
    if (!error) { 
     text.push(body); 
    } else { 
     console.log('Sorry. I couldn\'t parse that resource. ' + error); 
    } 
    } 

    return text; 

}; 

的問題是,resourceToText()返回取前陣()有時間來填充它。因此,resourcesText最終是空的。我認爲更高階的函數是爲了處理這種問題,但我無法想出一個方法來處理這個回調。

這個問題最好的解決方法是什麼?

+2

可能重複[如何從異步調用返回響應?](http://stackoverflow.com/questions/14220321/how-to-return-來自異步調用的響應) – Grundy

+0

使用承諾或回調。 –

回答

1

進行異步函數出resourcesToText由:

使用附加回調:

function resourcesToText(resources, callback) { 
    var text = [], 
     requestCount = resources.length; 

    for (var i in resources) { 
    request(resources[i], fetch); 
    } 

    function fetch(error, response, body) { 
    if (!error) { 
     text.push(body); 
    } else { 
     console.log('Sorry. I couldn\'t parse that resource. ' + error); 
    } 
    requestCount--; 
    if(requestCount <= 0){ 
     callback(text); 
    } 
    } 
}; 

呼叫與你的結果text回調後,你,你有你的請求的所有結果使用計數器(requestCount)。

現在調用resourcesToText樣子:

resourcesToText(resources, function(text){ 
    ... 
}); 

使用延遲/承諾

而不是使用一個回調的,你也可以實現延遲/承諾的概念。有許多庫,如q(https://github.com/kriskowal/q