2012-08-28 46 views
1

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

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

任何人都可以请指出为什么我的代码不能正常工作以及如何纠正它?

非常感谢!

编辑:布兰登蒂利的回应后,我从修订的callback(data)回调函数callback(e, data),但我没有得到响应,现在从最后console.log输出。

回答

2

异步库假定您的回调符合标准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"); 
+0

感谢布兰登您的回复!不幸的是,我试过你的解决方案,但是,我没有从'console.log(result)'命令获得任何数组输出?我上面编辑了我的代码以反映新的变化。 – rs77

+0

我已更新我的答案与其他问题。 –

+0

再次感谢布兰登!完善! – rs77