如何使用RXJS每2分钟拨打一次http电话?

时间:2017-06-28 17:37:33

标签: angular rxjs angular-http

我有一项服务,每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分钟拨打一次电话,最好的方法是什么?

6 个答案:

答案 0 :(得分:27)

由于您已经在使用Observables,只需充分利用它:Obersvable.interval()是您的好朋友:

在您的组件中,执行以下操作:

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

说明:

  1. .interval()创建一个每2个发出一个事件的observable 分钟。
  2. .timeInterval()将发出项目的Observable转换为一个 它会发出两者之间经过的时间量的迹象 排放。
  3. .flatMap()然后将每次服务电话打包, 将结果转换为可观察的并返回它。这确保了 您的服务呼叫在第0,第2,第4,第6 ......分钟被呼叫 同步。 (想想有很多.then()),即第2分钟的服务只会在第0分钟的呼叫后被呼叫,第4分钟只会在第2分钟后被呼叫,依此类推。
  4. .subscribe()最后您可以订阅数据
  5. 更新

    如果您正在使用可管理运算符(rxjs5及更高版本),只需管道运算符而不是链接它们:

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

答案 1 :(得分:2)

如果您使用的是rxJs 6+,则可以使用间隔方法来简化操作。像这样-

import { interval } from 'rxjs';

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

答案 2 :(得分:0)

如果您不想拨打http电话并且只想在2分钟后做某事,那么您可以执行以下操作。

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

你还想做一件更重要的事情,一旦你离开你当前的页面,你就会破坏这个observable,因为你不希望在实际不需要的情况下在场景后面进行额外的计算。

有多个选项可以取消订阅此观察值。

  1. 您应该保存对observable的引用,并在onDestroy方法中取消订阅。

    this.observableRef = Observable.interval(60000)
    .subscribe(() => {
      // do something
     });
    
    // call this method in OnDestroy method of the page.
    this.observableRef.unsubscribe();
    
  2. 或使用ngx-take-until-destroy

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

答案 3 :(得分:0)

我也有类似的需求。可以对某人有用,因此可以在这里写它。我的Angular版本是9.1.5。 我正在检查用户是否已登录,并每10分钟发送一次http请求,直到用户进入该组件。

 const secondsCounter = interval(60000); //Refreshes every 10 minutes
 secondsCounter
 .pipe(
   tap(console.log),
   takeWhile(x => this.notificationService.isLoggedIn()),
   flatMap(() => this.notificationService.getNotifications(this.token))
 ).subscribe()

答案 4 :(得分:0)

带有执行时间限制和按结果手动停止的小示例

this.insalesXlsSubject.pipe(
  switchMap((job_id: string) => {
    return interval(1000).pipe(
      mergeMap((i) => {
        return this.http.get(`${environment.backend}/${this.route.snapshot.params.insales_app_name}/api/make_insales_xls?job_id=${job_id}`)
      }),
      tap((y: any) => {
        if (y.status == 'finished') {
          this.insalesXlsStatusSubject.next()
        }
      }),
      takeUntil(race([
        this.insalesXlsStatusSubject,
        timer(60 * 1000).pipe(
          takeUntil(
            this.insalesXlsStatusSubject
          )
        )
      ]))
    )
  })
).subscribe()

答案 5 :(得分:-1)

import {Observable} from 'rxjs/Rx';

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

评论后更新

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