Node.js异步回调解释

时间:2014-04-23 13:18:57

标签: node.js asynchronous callback

我在下面有一个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
  }

});

1 个答案:

答案 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模块。