2012-08-28 110 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