Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用node.js执行多个http请求_Javascript_Node.js_Asynchronous_Design Patterns - Fatal编程技术网

Javascript 如何使用node.js执行多个http请求

Javascript 如何使用node.js执行多个http请求,javascript,node.js,asynchronous,design-patterns,Javascript,Node.js,Asynchronous,Design Patterns,我需要执行几个http请求。我有一个URL数组,当每个请求完成时,JSON对象被推送到一个数组中。当所有请求完成时,JSON对象将与新构造的数组一起发送到客户端。如果我在客户端执行此操作,我会使用类似于jQuery的延迟对象。是否有另一种方法使用node.js而不必导入jQuery的延迟对象?似乎不会使用事件发射器来处理此问题。还是会?谢谢 首先确保允许在Node.js中进行多个连接 require('http').globalAgent.maxSockets = 1000 此代码段允许Nod

我需要执行几个http请求。我有一个URL数组,当每个请求完成时,
JSON对象
被推送到一个数组中。当所有请求完成时,
JSON对象
将与新构造的
数组一起发送到客户端。如果我在客户端执行此操作,我会使用类似于
jQuery
的延迟对象。是否有另一种方法使用
node.js
而不必导入jQuery的延迟对象
?似乎不会使用事件发射器来处理此问题。还是会?谢谢

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

require('http').globalAgent.maxSockets = 1000
此代码段允许Node.js服务器为每个客户端接受1000个http请求


Node.js中有许多流控制

著名的是和


就我个人而言,我更喜欢
async
,因为它的功能与之类似或只是异步版本。

这里有一个可能的解决方案

此类扩展了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
};

是的,事件发射器可以处理这个问题。我可以想到的一个解决方案是在每个完成的请求之后发出一个事件,比如event:processed\u url\u count。然后有一个类似侦听器的事件:total_url_count,它将触发向客户端发送包含所有请求的数组。我试试看。
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);
});