2016-07-22 72 views
1

我掙扎在這個特別的挑戰:#9挑戰 - 瞭解您的節點(異步回調)

練習9 - 戲法異步

你必須收集由每個提供給您的全部內容URL並將其打印到控制檯(stdout)。您不需要輸出長度,只需將數據打印爲字符串;每個URL一行。問題在於,您必須以與將URL作爲命令行參數提供給您的順序相同的順序將其打印出來。

這裏是我的代碼:

var http = require('http'); 
 
var bl = require('bl') 
 
var results = []; 
 
var count = 0 
 

 
function getURLs() { 
 
    var urls = [] 
 
    for(var i = 2; i < process.argv.length; i++){ 
 
    urls.push(process.argv[i]); 
 
    } 
 
    return urls 
 
} 
 

 
function getHTTP(url){ 
 
    http.get(url, function(response){ 
 
    response.pipe(bl(function(err,data){ 
 
     if(err){return console.error(err)} 
 
     results[count] = data.toString(); 
 
     count ++; 
 
     if (count === process.argv.length - 2){ 
 
     printAll() 
 
     } 
 
    })) 
 
    }) 
 
} 
 

 
function printAll(){ 
 
    for(var i = 0 ; i < results.length; i++){ 
 
    console.log(results[i]) 
 
    } 
 
} 
 

 
function start(){ 
 
    retrivedURL = getURLs() 
 
    for(var i = 0; i < retrivedURL.length; i++){ 
 
    getHTTP(retrivedURL[i]) 
 
    } 
 
} 
 

 
start()

我似乎無法弄清楚它是錯的 - 它在檢索到的URL的順序進行輸出。

+1

您不能使用這樣的循環和異步函數,並期望維護順序,您需要異步調用異步調用。延續傳遞風格的一種方式是使用遞歸而不是循環。另一種選擇是使用承諾進行排序。 – elclanrs

回答

1

您可以使用async.eachSeries來實現此目的,即使此URL調用異步。很好地解釋了here