0

いくつかの http リクエストを実行する必要があります。各リクエストがJSON object配列にプッシュされると、URLの配列があります。すべてのリクエストが終了する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に似た機能を備えていますが、非同期バージョンであるためです。

于 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 に答える