node.js - 异步并行 HTTP 请求

标签 node.js asynchronous

我在加载大量 URL 的应用程序时遇到了控制流问题。我正在使用 Caolan Async 和 NPM 请求模块。

我的问题是,只要将函数添加到队列中,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
});

有没有更好的方法来解决这个问题?

最佳答案

for 循环与异步调用结合使用是有问题的(使用 ES5)并且可能会产生意外结果(在您的情况下,检索到错误的 URL)。

请考虑使用 async.map() :

async.map(myUrls, function(url, callback) {
  request(url, function(error, response, html) {
    // Some processing is happening here before the callback is invoked
    callback(error, html);
  });
}, function(err, results) {
  ...
});

鉴于您有 1000 多个要检索的 url,async.mapLimit() 也可能值得考虑。

关于node.js - 异步并行 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31761648/

相关文章:

node.js - 在 nextJS 中为 cookie 创建 HOC(高阶组件)

node.js - 让 Socket.io 与新的 SSL 加密网站一起工作

c++ - Qt 异步 Action 序列

node.js - 如何在 sails js 中一次使用对象参数请求保存多个数据

javascript - 已保存的 javascript facebook API 响应仍未定义?

node.js - 您如何安装和运行 Mocha,Node.js 测试模块?安装后获取 "mocha: command not found"

node.js - socket.io 远程客户端不工作

javascript - NodeJs 等到循环中的所有调用都完成

java - TCP 客户端和服务器

ruby - 在基于 EventMachine 的应用程序中读取文件的最佳方式是什么?