如果您需要等待所有的答覆,你不能使用常規的循環。而且因爲你在陣列中的所有網址,最好使用async.each
:
async.each(urls, function(url, eachCallback) {
request.get(url, function(err) {
// do something else
eachCallback();
}
}, function(err) {
// Done
}
基本上,async.each
接受三個參數:
- 網址 - 項目的數組迭代
- func1 - 作爲每個項目執行任務的函數。從陣列
- eachCallback的項目 - -
- 網址的回調函數爲你調用,只要你想說嘿,這任務是:只要調用這個函數,兩個參數一起傳遞完成了!
- FUNC2 - 一旦你遍歷所有的項目,所有
eachCallback
函數被調用,將執行一個功能。
請注意,人們往往會忘記在任務功能中調用eachCallback
。這將導致func2
未被執行。
如果你不想同時做到這一點。您可以改用async.eachSeries
。它做同樣的事情,除了順序調用任務功能,並且只有在您致電eachCallback
後。
如果您想繼續使用併發任務。您可能要考慮使用async.eachLimit
eachLimit
和each
之間的差異是,eachLimit
需要傳遞爲參數#2的數字:(async.eachLimit(urls, 10, func1, func2)
)。
這是一個很好的做法,尤其是如果你正在做耗盡機器資源的事情(比如做HTTP請求)。我在上一段中給出的例子將同時執行10個並行執行func1
。
您可以在async庫存儲庫中閱讀更多信息。
request.get在回調函數中返回一個[http.ServerResponse](https://nodejs.org/api/http.html#http_class_http_serverresponse) – ZimSystem