2012-10-05 47 views
0

我需要执行多个http请求。我有一组网址,当每个请求完成时,JSON object被推入一个数组中。当所有请求都完成时,JSON object将被发送到客户端,新建Array。如果我在做这个客户端,我会使用jQuery的Deferred对象。是否有另一种方法使用node.js而不必import jQuery's Deferred object?似乎事件发射器似乎不会被用来处理这个问题。或者会吗?谢谢!如何使用node.js执行多个http请求

+1

是的,事件发射器可以处理这个。我能想到的一个解决方案是在每个完成的请求之后发出一个事件,如event:processed_url_count。然后有一个监听器,如event:total_url_count,它将触发发送给包含所有请求的数组的客户端。 – ace

+0

我实际上正在考虑这一点,但认为这会很混乱。我会试试看。 –

回答

2

确保您允许Node.js的多个连接第一

require('http').globalAgent.maxSockets = 1000 

这段代码可以让你的Node.js服务器接受每个客户端1000个的HTTP请求。


有许多流量控制在Node.js的图书馆

最著名的是asyncstep

我个人更喜欢async,因为它的功能类似于underscorelodash,但它的异步版本。

0

这里是一个可能的解决方案。

此类扩展EventEmitter。它所做的是针对每个异步请求响应,我们发出完成的异步请求的计数并存储响应的主体。

var UrlHandler, events, request, urlHandler, 
    __hasProp = {}.hasOwnProperty, 
    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; 

events = require("events"); 
request = require("request"); 

UrlHandler = (function(_super) { 
    __extends(UrlHandler, _super); 

    function UrlHandler() { 
    return UrlHandler.__super__.constructor.apply(this, arguments); 
    } 

    UrlHandler.prototype.getUrls = function(urls) { 
    var processedUrls, url, urlhandler, _i, _len, _results; 
    processedUrls = 0; 
    urlhandler = this; 
    urlhandler.urlResponse = []; 
    _results = []; 
    for (_i = 0, _len = urls.length; _i < _len; _i++) { 
     url = urls[_i]; 
     _results.push(request({ 
     uri: url 
     }, function(error, response, body) { 
     urlhandler.urlResponse.push(response); 
     processedUrls++; 
     return urlhandler.emit("processed:" + processedUrls); 
     })); 
    } 
    return _results; 
    }; 

    return UrlHandler; 

})(events.EventEmitter); 

urlHandler = new UrlHandler(); 

module.exports = { 
    urlHandler: urlHandler 
}; 

然后在你的主应用程序,我们把听者'processed:' + urls.length所以一旦它与所有异步请求完成就会触发。

urls = ['http://stackoverflow.com/questions/12739605/how-to-perform-several-http-requests-with-node-js', 'http://stackoverflow.com']; 

UrlHandler.getUrls(urls); 
UrlHandler.once("processed:" + urls.length, function() { 
    return res.json(UrlHandler.urlResponse); 
});