Ионные лимиты вызовов API - PullRequest
0 голосов
/ 25 января 2019

Я использую API Spotify в Ionic, используя стороннюю библиотеку (я не делаю HTTP-запросы напрямую из своего кода), и я пытаюсь ограничить количество запросов в секунду, которые я отправляю.

Мои ожидания:

  • либо я смогу установить задержку для каждого запроса
  • или для установки максимально разрешенных запросов в секунду, и когда мне нужно отправить больше максимально разрешенных запросов в секунду (это будет число, заданное мной), этот фрагмент кода (библиотека, мой код и т. Д.) Будет ставить в очередь запросы и отправьте их позже.

Я не эксперт ни в Ionic, ни в Angular. Я попробовал это:

const apiCalls = [];

//in a for loop
apiCalls.push(fromPromise(this.spotifyApi.getArtistRelatedArtists(sourceArtist.mbid)).delay(this.apiDelay).toPromise());

//then
concat(...apiCalls).subscribe(

Это, похоже, не имеет никакого эффекта, например, я отправил 20 запросов с задержкой apiDelay в 1 секунду, и все они были завершены менее чем за 2 секунды.

Я пытался использовать библиотеки, как этот: простой скорости Ограничитель Но они предназначены для использования с 'require', и Ionic жалуется, что:

Не удалось найти файл объявления для модуля

Как я могу отложить запросы к внешнему API в Ionic?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Я решил это, изменив свой код на что-то вроде этого. В основном он использует setTimeout для задержки начала вызова API.

const apiCalls = [];
let i = 0;

//in a for loop
apiCalls.push(this.getRelatedArtistsWithDelay(i * this.apiDelay, sourceArtist.id[this.PROVIDER]));
i++;

//then
concat(...apiCalls).subscribe(

//and the getRelatedArtistsWithDelay function calls the API with a delayed start
  private getRelatedArtistsWithDelay(delay, artistId){
    return new Promise(resolve => {
      setTimeout(() => {
        this.spotifyApi.getArtistRelatedArtists(artistId).then((data) => {
          resolve(data);
        })
      },
      delay)
    });
  }
0 голосов
/ 25 января 2019

Возможно, вы можете попробовать следующий простой подход, демо https://stackblitz.com/edit/angular-http-client-kfnniw

// mock some random requests
for (let i = 0; i < 10; i++) {
  setTimeout(() => this.httpCalls.push({
    id: i,
    request: this.http.get<any[]>(this.apiUrl)
  }), Math.random() * 5000);
}

// handle queue
let interval = setInterval(() => {
  let toRun = this.httpCalls.splice(0, 5);
  for (let i = 0; i < toRun.length; i++) {
    ((r) => {
      let s = new Subject();
      r.request.subscribe(s);
      this.httpResponses.push({ id: r.id, subject: s });
    })(toRun[i]);
  }
}, 1000);

// in some other places, process actual requests
setInterval(() => {
  let r = this.httpResponses.splice(0, this.httpResponses.length);
  for (let i = 0; i < r.length; i++) {
    r[i].subject.subscribe(data => {
      console.log(`finished request ${r[i].id}`);
    });
  }
}, 1000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...