這裏的問題轉移是while循環是非阻塞的,因爲http.get
是非阻塞。所以你必須找出一種方法來使用回調按順序請求這些URL。如果你願意用async
模塊,可以實現如下它...
var http = require('http');
var async = require('async');
var url1 = process.argv[2]
var url2 = process.argv[3]
var url3 = process.argv[4]
var urls = [url1, url2, url3]
var results = [];
async.eachOf(urls, function(url, index, callback) {
http.get(url, function (res) {
var chars = "";
res.on('data', function(data){
chars += data.toString();
})
res.on('end', function(err){
results[index] = (chars);
callback(null, chars);
})
})
}, function (err) {
console.log(results);
});
如果你不想使用async
模塊,那麼你就必須手動保持在待定的URL請求的軌道while循環如下所示。
請注意使用立即調用的函數表達式(IIFE)來跟蹤執行上下文中的當前URL。這需要做的事情,因爲你想要的結果相同,提供的URL中的順序相同的順序...
var http = require('http');
var url1 = process.argv[2]
var url2 = process.argv[3]
var url3 = process.argv[4]
var urls = [url1, url2, url3]
var total = urls.length;
var results = [];
var processed = 0;
while (urls.length>0){
(function(url, index) {
http.get(url, function callback(response){
var chars = ""
response.on('data', function(data){
chars+=data.toString()
})
response.on('end', function(err){
results[index] = chars;
processed++;
if(processed === total) {
// do something with the result
console.log(results);
}
})
})
})(urls.shift(), total - urls.length - 1);
}
移動urls.shift()的異步代碼之外。 –
AJAX調用是異步的。您將不得不使用回調鏈或承諾 – Rajesh
您的當前代碼會執行異步調用,但您的'while'會阻止瀏覽器,直到所有請求都結束。它應該是無限循環 – Justinas