我在使用 Caolan Async 和 NPM request 模块加载大量 URL 的应用程序中遇到了控制流问题。
我的问题是,HTTP 响应会在将函数添加到队列时立即开始。理想情况下,我希望先建立队列,只有在队列开始时才开始发出 HTTP 请求。否则,在队列开始之前回调函数就开始触发,导致队列过早结束。
var request = require('request') // https://www.npmjs.com/package/request
, async = require('async'); // https://www.npmjs.com/package/async
var myLoaderQueue = []; // passed to async.parallel
var myUrls = ['http://...', 'http://...', 'http://...'] // 1000+ urls here
for(var i = 0; i < myUrls.length; i++){
myLoaderQueue.push(function(callback){
// Async http request
request(myUrls[i], function(error, response, html) {
// Some processing is happening here before the callback is invoked
callback(error, html);
});
});
}
// The loader queue has been made, now start to process the queue
async.parallel(queue, function(err, results){
// Done
});
有没有更好的方法来解决这个问题?
got
、http.min
、axios
)结合Promise.allSettled()
(或基于Promise的速率限制器/队列)都可以。 - robertklepQ
(Q.allSettled()
) 来处理并行操作,而使用https
来进行实际请求。 - Jonny