【发布时间】:2015-02-18 02:25:14
【问题描述】:
我有一个向 API 发出请求的 request-promise 函数。我受到此 API 的速率限制,并且不断收到错误消息:
Exceeded 2 calls per second for api client. Reduce request rates to resume uninterrupted service.
我正在并行运行几个Promise.each 循环,这会导致问题,如果我只运行Promise.each 的一个实例,一切运行正常。在这些Promise.each 调用中,它们导致与request-promise 调用相同的函数a。我想用另一个queue 函数包装这个函数,并将间隔设置为500 毫秒,这样request 就不会一个接一个地创建,也不会并行创建,而是设置为队列中的那个时间。问题是我仍然需要这些承诺来获取它们的内容,即使需要很长时间才能得到响应。
有什么可以为我做这件事的吗?我可以包装一个函数,它会以设定的时间间隔响应,而不是并行或一个接一个地触发函数?
更新:也许确实需要promise具体,我尝试使用下划线的油门功能
var debug = require("debug")("throttle")
var _ = require("underscore")
var request = require("request-promise")
function requestSite(){
debug("request started")
function throttleRequest(){
return request({
"url": "https://www.google.com"
}).then(function(response){
debug("request finished")
})
}
return _.throttle(throttleRequest, 100)
}
requestSite()
requestSite()
requestSite()
我得到的只是这个:
$ DEBUG=* node throttle.js
throttle request started +0ms
throttle request started +2ms
throttle request started +0ms
【问题讨论】:
-
您能否向我们展示一些您的实际代码,以便我们可以使用?
-
@jfriend00 我的实现非常特定于 API。我所拥有的是
request的包装器,一大堆函数都在使用它。这就是我可以节制的点。我想用某种排队功能包装包含request的包装器。 -
此类问题的通用解决方案:spex.
标签: javascript queue promise bluebird rate-limiting