Как сделать HTTP-вызов каждые 2 минуты с помощью RXJS?

У меня есть служба, которая будет звонить в мой сервис отдыха каждые 2 минуты. В моем сервисе у меня есть следующая функция

  getNotifications(token: string) {
     const body = 'xxxxxxxxx=' + token;
     return this.http.post('/rest/ssss/ddddddd/notificationcount', body, this.options)
          .map((res) => res.json());
  }

В моем компоненте я вызываю свою служебную функцию для вызова API.

this.notificationService.getNotifications(this.token).subscribe((data) => {
  console.log(data);
});

Я хочу сделать этот вызов каждые 2 минуты, что лучший способ сделать это?

Ответ 1

Поскольку вы уже используете Observables, просто используйте его в полной мере :) Obersvable.interval() ваш хороший друг здесь:

В вашем компоненте сделайте это:

Observable
    .interval(2*60*1000)
    .timeInterval()
    .flatMap(() => this.notificationService.getNotifications(this.token))
    .subscribe(data => {
        console.log(data);
    });

Объяснение:

  1. .interval() создает наблюдаемое, которое генерирует событие каждые 2 минут.
  2. .timeInterval() конвертирует Наблюдаемый, который испускает предметы в один который испускает указание количества времени, прошедшего между этими Выбросы.
  3. .flatMap() затем оборачивает каждый ваш сервисный вызов, превратить результаты в наблюдаемые и вернуть его. Это обеспечить То, что ваш сервисный звонок на 0-й, 2-й, 4-й, 6-й.... минута называется синхронно. (подумайте о том, что .then() много)), т.е. служба на 2-й минуте будет вызываться только после 0-й минуты звонка, а 4-й будет только после 2-й и т.д.
  4. .subscribe() наконец вы можете подписаться на данные

Обновление:

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

interval(2 * 60 * 1000)
    .pipe(
        flatMap(() => this.notificationService.getNotifications(this.token))
    )
    .subscribe(data => console.log(data))

Ответ 2

Если вы не хотите совершать http-вызов и просто хотите что-то сделать через 2 минуты, тогда вы можете сделать что-то вроде ниже.

 Observable.interval(2*60*1000)
  .subscribe(() => {
    // do something.
    // or callSomeMethod();
  });

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

Есть несколько вариантов отписаться от этой наблюдаемой.

  1. Вы должны сохранить ссылку на наблюдаемое и отказаться от нее в методе onDestroy.

    this.observableRef = Observable.interval(60000)
    .subscribe(() => {
      // do something
     });
    
    // call this method in OnDestroy method of the page.
    this.observableRef.unsubscribe();
    
  2. ИЛИ используйте ngx-take-till-destroy

    Observable.interval(60000)
    .takeUntil(this.destroyed$)
    .subscribe(() => {
      //  do something
    });
    

Ответ 3

Если вы используете rxJs 6+, вы можете просто использовать метод интервала. как это -

import { interval } from 'rxjs';

interval(3000).subscribe(x => /* do something */)

Ответ 4

import {Observable} from 'rxjs/Rx';

  Observable.interval(2 * 60 * 1000).subscribe(x => {
    callyourmethod();
  });

Обновление после комментария

this.interval = setInterval(() => {
        this.yourservicecallmethod();
    }, 2 * 60 * 1000);