2012-10-05 46 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); 
});