У меня есть лимит API 10 вызовов в секунду (однако тысячи в день), однако, когда я запускаю эту функцию (вызывается каждый идентификатор стиля объекта,> 10 в секунду):Как ограничить вызовы API в секунду с помощью angular2
getStyleByID(styleID: number): void {
this._EdmundsAPIService.getStyleByID(styleID).subscribe(
style => {this.style.push(style); },
error => this.errorMessage = <any>error);
}
от этой функции (только 1 вызов, используется OnInit):
getStylesWithoutYear(): void {
this._EdmundsAPIService.getStylesWithoutYear(this.makeNiceName, this.modelNiceName, this.modelCategory)
.subscribe(
styles => { this.styles = styles;
this.styles.years.forEach(year =>
year.styles.forEach(style =>
this.getStyleByID(style.id)));
console.log(this.styles); },
error => this.errorMessage = <any>error);
}
Это делает> 10 вызовов в секунду. Как отключить или замедлить эти вызовы, чтобы предотвратить получение ошибки 403?
Этот подход не решает проблему @ Miguel, если запросы не отправляются быстрее, чем их можно отправить, последовательно.Например, запустите код JSBin, подождите 5 секунд, затем запустите его в консоли JSBin: 'for (let i = 0; i <20; i ++) {getStyleByID (i);}'. Они будут стрелять сразу и не будут дросселировать должным образом, потому что неиспользуемые интервалы хранятся в почтовом индексе, ожидающем использования, вместо того, чтобы отбрасываться, если они не используются немедленно. – Adam
Хороший улов, Адам! Только Мигель может сказать, будет ли мое предложение работать в его случае или нет. Если это не так, как бы вы сделали его пуленепробиваемым? – AngularChef
[Вот JSBin моего решения.] (Http://jsbin.com/lesatebiwo/1/edit?js,console) Единственный недостаток в том, что каждый запрос всегда задерживается на 100 м, включая первый. Не стесняйтесь редактировать свой пост с помощью этого решения, если считаете, что это улучшение. Я нашел решение [здесь] (http://www.g9labs.com/2016/03/21/lossless-rate-limiting-with-rxjs/) – Adam