0

我需要执行几个 http 请求。我有一个 url 数组,当每个请求完成时,JSON object它被推入一个数组。当所有请求完成后,将JSON object使用新构建的Array. 如果我在做这个客户端,我会使用类似jQuery的 Deferred 对象。是否有另一种node.js无需使用的方法import jQuery's Deferred object?似乎不会使用事件发射器来处理这个问题。还是会?谢谢!

4

2 回答 2

2

确保首先在Node.js中允许多个连接

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

此代码段允许您的 Node.js 服务器为每个客户端接受 1000 个 http 请求。


Node.js中有很多流控制库。

著名的是asyncstep

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

于 2012-10-05T05:09:19.070 回答
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);
});
于 2012-10-05T06:15:01.943 回答