2012-06-16 180 views
7

我想一起使用異步和請求模塊,但我不明白如何通過回調。我的代碼是使用nodejs異步和請求模塊

var fetch = function(file, cb) { 
    return request(file, cb); 
}; 

async.map(['file1', 'file2', 'file3'], fetch, function(err, resp, body) { 
    // is this function passed as an argument to _fetch_ 
    // or is it excecuted as a callback at the end of all the request? 
    // if so how do i pass a callback to the _fetch_ function 
    if(!err) console.log(body); 
}); 

我試圖以獲取3個文件,並連接結果。我的頭被困在我嘗試過的回調以及我能想到的不同組合中。谷歌沒有太多的幫助。

回答

32

請求是異步函數,它不返回任何內容,當它的工作完成時,它會回調。從request examples,你應該這樣做:

var fetch = function(file,cb){ 
    request.get(file, function(err,response,body){ 
      if (err){ 
       cb(err); 
      } else { 
       cb(null, body); // First param indicates error, null=> no error 
      } 
    }); 
} 
async.map(["file1", "file2", "file3"], fetch, function(err, results){ 
    if (err){ 
     // either file1, file2 or file3 has raised an error, so you should not use results and handle the error 
    } else { 
     // results[0] -> "file1" body 
     // results[1] -> "file2" body 
     // results[2] -> "file3" body 
    } 
}); 
+1

代碼工作,很容易理解我做錯了什麼,現在:)謝謝 – andrei

+0

您對實例鏈接不顯示任何回調。他們所做的只是登錄到控制檯。 – Catfish

3

在您的例子中,fetch函數將被調用三次,一次爲每個作爲第一個參數來傳遞async.map陣列中的文件名。第二個回調參數也將被傳遞到fetch,但該回調由異步框架提供,並且您的fetch函數完成其工作時必須調用它,並將其結果作爲第二個參數提供給該回調。當所有三個fetch調用都調用提供給它們的回調時,將調用您提供的作爲async.map的第三個參數的回調。

https://github.com/caolan/async#map

所以回答您的具體問題中的代碼,您提供的回調函數作爲回調的然後結束所有的請求的執行。如果你需要一個回調傳遞給fetch你會做這樣的事情:

async.map([['file1', 'file2', 'file3'], function(value, callback) { 
    fetch(value, <your result processing callback goes here>); 
}, ...