我在下面有一个node.js文件调用test.js。 不知道为什么全部完成了!'将始终打印在输出的顶部。 有人可以解释为什么全部完成!'始终是控制台中的第一个输出。 在完成所有请求并退出应用程序后,如何将其作为最后一行打印? 我尝试使用setTimeout来完成'全部完成'是最后一个,但它不会有帮助,因为你永远不知道每个请求将完成多长时间。 我应该使用process.exit()吗?
var async = require('async');
var request = require('request');
var http = require('http');
var websites = [
'qz.com',
'www.stackoverflow.com',
'www.google.com'
];
//get header of each URL
var getHeader = function(url, callback){
var options = {
method: 'HEAD',
host: url,
port: 80,
timeout: 10000,
followRedirect: true,
maxRedirects: 10,
path: '/'
};
var req = http.request(options, function(res) {
//If connect server successfully, get Status code and header
console.log('website name:' + url);
console.log('Status Code:' + res.statusCode);
console.log(JSON.stringify(res.headers));
console.log("\n");
});
//if Error happens print out error
req.on('error', function(err) {
console.log('website name:' + url);
console.log(err);
console.log("\n");
});
req.end();
return callback(null);
}
async.each(websites, getHeader, function(err){
// if error happens, remind user
if(err) {
console.log('one url failed to be processed.');
} else {
console.log('All done!'); //print all done when all request complete
}
});
答案 0 :(得分:1)
您在getHeader函数结束时立即调用回调。您需要在请求完成时调用它:
var getHeader = function(url, callback){
var options = {
method: 'HEAD',
host: url,
port: 80,
timeout: 10000,
followRedirect: true,
maxRedirects: 10,
path: '/'
};
var req = http.request(options, function(res) {
//If connect server successfully, get Status code and header
console.log('website name:' + url);
console.log('Status Code:' + res.statusCode);
console.log(JSON.stringify(res.headers));
console.log("\n");
res.resume(); // flush response stream just in case
callback();
});
//if Error happens print out error
req.on('error', function(err) {
console.log('website name:' + url);
console.log(err);
console.log("\n");
callback(err);
});
req.end();
}
此外,您的options
包含不适用于http.request的设置。它们用于第三方request模块。