2017-04-04 40 views
-2

我只是想檢查URL列表,看是否存在各自繼續畢竟已經完成:async.each - 回調是什麼?

var urls = [ "http://...", "http://...", ... ]; 

async.each(urls, function(url, ??callback??) { 
      http.get(url, function(response) { 
       console.log(response.statusCode); 
      }); 
      }, function(err) { 
       if (!err) 
        console.log("All urls called"); 
      }); 

我該怎麼把爲??callback??時,我什麼都沒有繼續每個任務完成後? documentation並不表示它是可選的。

+0

要說清楚,你正在談論'iteratee'接收的回調,對吧?不是最終的整體回調,這確實是可選的。 –

+0

是的,'iteratee'中的那個,完全如我的代碼所示。我不知道我被拒絕了。 –

+0

我不知道。 :-)似乎是一個合理的問題。許多事情不一定立即從文檔中清除... –

回答

2

second parameteriteratee,其是AsyncFunction

AsyncFunction()

一種在異步的上下文中,「異步函數」與參數的可變數目的異步函數,用最終參數是回調。 (function (arg1, arg2, ..., callback) {})最終回調的形式爲callback(err, results...),必須在函數完成後調用它。應使用Error作爲其第一個參數來調用回調,以表示發生了錯誤。否則,如果沒有發生錯誤,則應該使用null作爲第一個參數以及可能應用的任何其他結果參數來調用,以表示成功完成。回調必須恰好調用一次,理想情況是稍後在JavaScript事件循環中打勾。

這是一個參數async用你的iteratee來調用。在你的情況,你需要調用它時,get完成(成功或失敗):

var urls = [ "http://...", "http://...", ... ]; 
async.each(urls, function(url, callback) { 
    http.get(url, function(response) { 
     console.log(response.statusCode); 
     callback(null); // <==== 
    }); 
}, function(err) { 
    if (!err) 
     console.log("All urls called"); 
}); 

async需要知道的操作已經完成,因此它可以管理整個過程。

我上面的例子很簡單,您可能想區分成功與失敗,但想法是您必須調用您收到的回調,包括錯誤(第一個參數)或成功(第一個參數= null,可選的第二個參數論據)。

+1

我明白了,所以'callback'是由async提供的。謝謝。 –

+0

@OldGeezer:是的,正好。 :-) –

0

當您完成每項異步任務(即獲取URL)時,您打算撥打callback

所以像...

http.get(url, function(response) { 
    // Here you call it with `null` to signify a non-error completion. 
    callback(null); 
}); 

...你的主要每個函數中。如果您只想在沒有任何其他代碼的情況下調用它,則可以使用http.get(url, callback.bind(null, null))

+1

Downvoter:這裏沒有什麼用處? –