Angular 6 бесконечный цикл и ждать ответа API - PullRequest
0 голосов
/ 30 августа 2018

Я хочу добиться следующего в угловых 6:

while (true) {

  • API вызова
  • обработать ответ
  • подождите 1 секунду

}

Я пробовал TimerObservable, но не смог подождать 1 секунду после завершения запроса, потому что он асинхронный. Цель состоит не в том, чтобы вызывать API, когда запросы занимают много времени, а в том, чтобы последние ответы были быстрыми, когда запросы выполняются в течение короткого времени.

Мой код:

TimerObservable.create(0, 1000)
  .subscribe(() => {
    this.api.getData().subscribe(
      response => {
        console.log(response);
      }
    );
  });

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Вы должны использовать оператор выхлопных карт ( см. Документ здесь ), чтобы преобразовать свой «пересекающийся» тик в вызов API. ExhaustMap будет ожидать завершения вызова API, прежде чем запускать новый.

Попробуйте это (синтаксис rxjs 6):

import { interval, of } from 'rxjs';
import { exhaustMap } from 'rxjs/operators';

interval(1000)
.pipe(
    exhaustMap(_ => this.api.getData())
)
.subscribe(response => console.log(response));
0 голосов
/ 30 августа 2018

Это немного неуклюже, но если вы хотите всегда сначала обрабатывать ответ, а затем ждать, я не знаю более простого способа сделать это.

Observable.timer(0, 1000)
  .concatMap(() => mockApiGetData()
    .concatMap(val => Observable.of(null)
      .delay(1000)
      .takeWhile(() => false)
      .startWith(val)
    )
  )
  .subscribe(val => console.log('process', val))

Демонстрационная версия: https://stackblitz.com/edit/typescript-lemfdn?file=index.ts

См. Также: Наблюдаемые и как контролировать результаты темпа

0 голосов
/ 30 августа 2018

Вы всегда можете использовать рекурсию для этого. Поместите вызов в функцию и в случае успеха подождите 1 секунду, а затем снова вызовите функцию.

callApi() {
  this.api.getData().subscribe(
    response => {
      console.log(response);
      setTimeout(() => this.callApi(), 1000);
    }
  );
}

Имейте в виду, что этот код остановится в случае сбоя, поэтому вы можете также добавить обработчик ошибок. Возможно, вы захотите подождать дольше, если возникнет ошибка, например

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...