Как реализовать механизм опроса в угловых, который должен вызываться каждый интервал времени? - PullRequest
0 голосов
/ 14 мая 2019

Как реализовать механизм опроса в Angular?

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

при первом вызове API, мы получаем данные в результате, мы получаем интервал для вызова API в результате [0] .requestInterval и мы получаем флаг для прекращения вызова API в результате [0] .requestComplete если это правда, мы должны прекратить вызывать API, иначе снова вызвать API

this.bookFlightService.GetFlights(this.baseUrl, searchResource, inboundDate)
            .subscribe(result => {
                this.callNo++;
                this.bookFlights = result as BookFlights[];
                this.requestComplete = this.bookFlights[0].complete;
                this.requestInterval = this.bookFlights[0].callAfterMs;
)

Ответы [ 3 ]

0 голосов
/ 14 мая 2019
destructor$ = new Subject();

this.bookFlightService.GetFlights(this.baseUrl, searchResource, inboundDate).pipe(
  switchMap(response => timer(0, 1000)),
  tap(() => this.callNo++),
  switchMap(() => this.makeHttpCall()),
  takeUntil(this.destructor$),
  tap(response => { if(response.complete) this.destructor$.next(); }),
).subscribe(response => console.log(response));

1 - создайте тему, чтобы остановить поток, когда вы хотите
2 - Сделайте ваш Http-звонок впервые
3 - Изменить поток на таймер (испускается один раз, затем каждые заданные мс)
4 - Увеличьте количество звонков (оригинальный код)
5 - снова переключите ваш таймерный поток на новый вызов вашего API
6 - продолжай, пока объект не испустит 7 - Излучение на деструктор, если необходимо

Демонстрация стекаблиц

0 голосов
/ 14 мая 2019

Ваша проблема не в том, что вы не знаете, как сделать интервальный вызов, а в том, как его завершить.

Ваш ответ - метод takeUntil. Таким образом, вы можете декларативно завершить подписку.

private ngUnsubscribe: Subject<any> = new Subject();
...
this.httpClient.post(<shortened for brevity>).pipe(interval(1000), takeUntil(this.ngUnsubscribe)).subscribe((data: any) => {

// do something with your data. If you got the data from the backend, the flag that disables the subscribable you can do...
this.ngUnsubscribe.next(); 
})

Метод takeUntil прекратит любую подписку, как только будет передано новое значение.

0 голосов
/ 14 мая 2019

мы можем позвонить в наш сервис через равные промежутки времени, как это.

Observable
    .interval(2*60*1000)
    .timeInterval()
    .flatMap(() => this.bookFlightService.GetFlights(abc, def, ghi)
    .subscribe(data => {
        console.log(data);
    });

Обновление: Если вы используете конвейерные операторы (rxjs5 и выше), просто передайте операторы по конвейеру вместо их цепочки:

интервал (2 * 60 * 1000) .pipe ( flatMap (() => this.bookFlightService.GetFlights (abc, def, ghi) ) .subscribe (data => console.log (data))


Попробуйте с таймером от RxJS:

import { Subscription, timer, pipe } from 'rjxs';
import { switchMap } from 'rxjs/operators';

subscription: Subscription;
statusText: string;

ngOnInit() {
    this.subscription = timer(0, 10000).pipe(
      switchMap(() => this.myservice.checkdata())
    ).subscribe(result => this.statustext = result);
}

интервал (10000) от RxJS не подходит, потому что он начнет излучать значение только через 10 секунд, а не сразу в первый раз.

Таймер (0, 10000) будет выдавать значение немедленно (0) и каждые 10 секунд (10000).

...