Async.Map的回调不起作用

时间:2012-08-28 21:05:12

标签: node.js asynchronous callback

我对回调相对较新,并且未能成功获得以下代码。我已经使用async.map函数将每个Web调用的数据返回到其各自的页面。但是,即使console.log(return)之前的[ , undefined]返回网页的html,我的console.log(data)也会返回callback(data)。这是我的代码:

var http = require("http"),
    fs = require("fs"),
    page, chap, ot,
    async = require("async");

ot = fs.open('ot.txt', 'w');        
page = "test";
chap = 2;

function getData(url, callback) {
  var data = "";
  var options = {
    host: "rs.au.com",
    port: 80
  }
  options.path = url;
  console.log("request sent to: http://" + options.host + options.path);
  var req = http.request(options, function(res) { 
    console.log("Response received " + res.statusCode);
    res.on('data', function(chunk) {
        data += chunk;
    });
    res.on('end', function(e) {
        console.log(data);
        callback(e, data);
    });
  }).end();
}   

function main() {
  var pathArr = [];
  for ( var i = 1; i <= chap; i++ ) {
    pathArr[i] = "/".concat(page, "/", i, ".html");
  }
  async.map(pathArr, getData, function(err, result) {
    console.log("The result is :" + result);
  });
}

main();

有人可以指出为什么我的代码无效以及我如何纠正它?

非常感谢!

编辑:在Brandon Tilley的回复之后,我将回调函数从callback(data)修改为callback(e, data),但是我现在没有得到回复console.log输出

1 个答案:

答案 0 :(得分:2)

Async库假设您的回调符合标准Node.js回调签名,即callback(err, others...)。由于您将data作为第一个参数传递,因此Async认为这是一个错误。您应该使用callback(e, data)代替(如果没有错误,e将是null。)

<强> [更新]

另一个问题是您的阵列不正确。由于i从1开始并一直升至chap,因此pathArr[0]未定义。变化:

pathArr[i] = "/".concat(page, "/", i, ".html");

pathArr[i-1] = "/".concat(page, "/", i, ".html");