API опроса с использованием Angular HTTP Observable - PullRequest
0 голосов
/ 27 июня 2018

В моем html-компоненте я использую asyncPipe для подписки на этот http-сервис. Сервис отображает объект ответа json на массив экземпляров классов. Все это прекрасно работает, но я бы хотел, чтобы http-служба проводила опрос каждые несколько секунд. Я перепробовал кучу вещей (например, интервал), но кажется, что RXJS в настоящее время немного минное поле. Кто-нибудь реализовывал подобные вещи, используя Angular 6?

fetch(command, params?) {
    return this.http.post(`http://localhost:4000/${command}`, params)
      .pipe(
        map((data: Data) => {
          const statuses: Status[] = [];
          for (const statusKey of Object.keys(data.statuses)) {
            const newStatus = new Status(
               // do some object translation...
           );
           statuses.push(newStatus);
          }
        return statuses;
        })
      )
      .pipe(
        catchError(EpisodeApiService.handleError)
      );
  }

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы также можете сделать это, если вы не хотите использовать rxjs

 setInterval(function(){
      serviceObj.httpObservable.subscribe(x => {});
    }, 10000)
0 голосов
/ 27 июня 2018

Это должно быть так просто:

    pollInterval = 5000;
    const httpObservable = interval(pollInterval).pipe(
    switchMap(x => fetch(command, params?) )
   );

pollInterval может быть изменено в соответствии с требованиями. interval и switchMap должны быть импортированы следующим образом:

import { interval } from 'rxjs';
import { switchMap } from 'rxjs/operators'; 

Использование switchMap здесь помогает отменить любые отложенные HTTP-запросы с задержкой, это хорошо для производительности, особенно во время прерывистых интернет-соединений. Вот почему RxJS реактивный способ сделать это предпочтительнее традиционных методов, таких как setInterval().

Также должна быть окончательно оформлена подписка, иначе ничего не произойдет:

httpObservable.subscribe(x => {});
...