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