У меня есть функция request-promise, которая обращается к API. Я ограничен по скорости этого API и я получаю сообщение об ошибке:Временная очередь ожидания/дроссельная заслонка
Exceeded 2 calls per second for api client. Reduce request rates to resume uninterrupted service.
Я бегу пару Promise.each
петель параллельно, который вызывает проблему, если я запускаю только один экземпляр Promise.each
все работает нормально. Внутри этих вызовов Promise.each
они приводят к той же функции a с вызовом request-promise. Я хочу обернуть эту функцию другой функцией queue
и установить интервал 500
миллисекунд, чтобы request
не был создан один за другим или параллелен, но установлен в это время в очереди. Дело в том, что мне все еще нужны эти обещания, чтобы получить их содержимое, даже если для получения ответа потребуется довольно много времени.
Есть ли что-нибудь, что сделает это для меня? Что-то, что я могу обернуть функцией, и она будет реагировать на заданный интервал, а не параллельно или запускать функции один за другим?
Update: Возможно, это действительно должно быть обещание конкретным, я пытался использовать функцию дроссельной Underscore в
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
@ jfriend00 Моя реализация довольно специфична для API. У меня есть оболочка для 'request', которую использует целая куча функций. Вот в чем я могу задушить. Я хочу обернуть эту оболочку, содержащую 'request', с некоторой функцией очередей. – ThomasReggi
Общее решение таких проблем: [spex] (https://github.com/vitaly-t/spex). –