【问题标题】:Callback for Async.Map Not WorkingAsync.Map 的回调不起作用
【发布时间】:2012-08-23 10:46:15
【问题描述】:

我对回调比较陌生,并且未能成功使以下代码正常工作。我已经使用 async.map 函数将来自每个 Web 调用的数据返回到其各自的页面。但是,我的console.log(return) 正在返回[ , undefined],即使callback(data) 之前的console.log(data) 正在返回网页的html。这是我的代码:

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 输出中得到任何回复。

【问题讨论】:

    标签: node.js asynchronous callback


    【解决方案1】:

    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");
    

    【讨论】:

    • 感谢布兰登的回复!不幸的是,我尝试了您的解决方案,但是,我没有从 console.log(result) 命令得到任何数组输出?我已经编辑了上面的代码以反映新的变化。
    • 再次感谢布兰登!完美!
    猜你喜欢
    • 2018-12-28
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2013-11-20
    • 2018-04-08
    • 2015-11-09
    • 2012-03-19
    相关资源
    最近更新 更多