這次的問題和之前的問題(HTTP 收集器)很像,也是需要使用到 http.get() 方法。然而,這一次,將有三個 URL 作為前三個命令行參數提供。
需要收集每一個 URL 所返回的完整內容,然后將它們在終端(標準輸出stdout)打印出來。這次不需要打印出這些內容的長度,僅僅是內容本身即可(字符串形式);每個 URL對應的內容為一行。重點是必須按照這些 URL 在參數列表中的順序將相應的內容排列打印出來才算完成。
不要期待這三臺服務器能好好的一起玩耍!他們可能不會把完整的響應的結果按照希望的順序返回,所以不能天真地只是在收到響應后直接打印出來,因為這樣做的話,他們的順序可能會亂掉。
需要去跟蹤到底有多少 URL 完整地返回了他們的內容,然后用一個隊列存儲起來。一旦擁有了所有的結果,才可以把它們打印到終端。
對回調進行計數是處理 Node 中的異步的基礎。比起自己去做,去依賴一個第三方的模塊或者庫會更方便,比如?async?或者?after。不過,在本次練習中,應該首先嘗試自己去解決,而不是依賴外部的模塊。
var http = require('http');
var result = ['','',''];
var isEnd = [false, false, false];
http.get(process.argv[2], function(res){
res.setEncoding('utf8');
res.on('data', function(data){
result[0] += data;
});
res.on('end', function(data){
isEnd[0] = true;
if(isEnd[0]&&isEnd[1]&&isEnd[2]){
console.log(result[0]);
console.log(result[1]);
console.log(result[2]);
}
});
});
http.get(process.argv[3], function(res){
res.setEncoding('utf8');
res.on('data', function(data){
result[1] += data;
});
res.on('end', function(data){
isEnd[1] = true;
if(isEnd[0]&&isEnd[1]&&isEnd[2]){
console.log(result[0]);
console.log(result[1]);
console.log(result[2]);
}
});
});
http.get(process.argv[4], function(res){
res.setEncoding('utf8');
res.on('data', function(data){
result[2] += data;
});
res.on('end', function(data){
isEnd[2] = true;
if(isEnd[0]&&isEnd[1]&&isEnd[2]){
console.log(result[0]);
console.log(result[1]);
console.log(result[2]);
}
});
});
var http = require('http')
var bl = require('bl')
var results = []
var count = 0
function printResults () {
for (var i = 0; i < 3; i++)
console.log(results[i])
}
function httpGet (index) {
http.get(process.argv[2 + index], function (response) {
response.pipe(bl(function (err, data) {
if (err)
return console.error(err)
results[index] = data.toString()
count++
if (count == 3)
printResults()
}))
})
}
for (var i = 0; i < 3; i++)
httpGet(i)
更多建議: