如果您需要等待所有的答复,你不能使用常规的循环。而且因为你在阵列中的所有网址,最好使用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