1

我对回调比较陌生,并且未能使以下代码正常工作。我已经使用 async.map 函数将来自每个 Web 调用的数据返回到其各自的页面。但是,即使在返回网页的 html之前,我console.log(return)也会返回。这是我的代码:[ , undefined]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输出中得到任何回复。

4

1 回答 1

2

Async 库假定您的回调遵循标准的 Node.js 回调签名,即callback(err, others...). 由于您data作为第一个参数传递,因此 Async 假定它是一个错误。您应该callback(e, data)改用(因为在没有错误的情况下)。enull

[更新]

另一个问题是您的数组不正确。由于i从 1 开始并上升到chap,pathArr[0]是未定义的。改变:

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

pathArr[i-1] = "/".concat(page, "/", i, ".html");
于 2012-08-28T22:23:33.447 回答