12

我有一个 NodeJS 应用程序,它从代码中的各个位置发送 HTTP 获取请求,有些甚至是依赖的(发送请求,等待回复,处理它并根据结果发送另一个请求)。我需要限制请求的速率(例如,每小时 10 个请求)。

我考虑过将请求排队,然后在某个中心点以受控方式释放它们,但在如何对回调函数及其相关参数进行排队时陷入困境。

很高兴听到有关如何以最少的应用程序重组来克服这种情况的建议。

谢谢

4

3 回答 3

8

我想你已经回答了你的问题。可以限制您的请求的中央队列是要走的路。这里唯一的问题是队列必须具有请求的完整信息和应该使用的回调。我会将其抽象为一个QueueableRequest看起来像这样的对象:

var QueueableRequest = function(url, params, httpMethod, success, failure){
  this.url = url;
  this.params = params;
  ...

}
//Then you can queue your request with

queue.add(new QueueableRequest({
  "api.test.com",
  {"test": 1},
  "GET",
  function(data){ console.log('success');},
  function(err){ console.log('error');}
}));

当然,这只是示例代码,可能会更漂亮,但我希望你能明白。

于 2012-05-26T21:25:37.733 回答
2

Async模块有许多可以帮助您的控制流选项。queue听起来很合适,您可以在其中限制并发性。

于 2012-05-27T14:36:07.523 回答
0

我会使用Deferreds并为每个排队的请求返回一个。然后,您可以在延迟承诺排队后将成功/失败回调添加到延迟承诺。

var deferred = queue.add('http://example.com/something');
deferred.fail(function(error) { /* handle failure */ });
deferred.done(function(response) { /* handle response */ });

[ url, deferred ]您可以在队列中保留一对,并且每次将 URL 出列时,您还将拥有与之配套的 Deferred,您可以在处理请求后解决或失败。

于 2012-05-26T21:14:45.290 回答