如何使用 RXJS 每 2 分钟进行一次 http 调用?

How to make an http call every 2 minutes with 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 分钟打一次这个电话,最好的方法是什么?

import {Observable} from 'rxjs/Rx';

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

评论后更新

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

既然你已经在使用Observables,那就好好利用吧:)Obersvable.interval()是你的好朋友:

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

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

解释:

  1. .interval() 创建一个每 2 次发出一个事件的 Observable 分钟。
  2. .timeInterval() 将发射物品的 Observable 转换为一个 发出这些之间经过的时间量的指示 排放量。
  3. .mergeMap() 然后包装您的 每次 服务调用, 将结果转换为可观察对象并 return 它。这确保 您在第 0、2、4、6 分钟的服务电话被称为 同步地。 (想想有很多.then()),即第0分钟调用后才会调用第2分钟的服务,第2分钟后才会调用第4分钟,依此类推。
  4. .subscribe()终于可以订阅数据了

更新:

如果您使用可管道运算符(rxjs5 及更高版本),只需将运算符通过管道传输而不是将它们链接起来:

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

如果您不想进行 http 调用,只想在 2 分钟后执行某些操作,那么您可以执行如下操作。

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

如果您使用的是 rxjs 6+,那么您可以这样做:

  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
     });
    

如果你使用的是rxJs 6+,你可以简单的使用interval方法来做。像这样 -

import { interval } from 'rxjs';

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

我有一个类似的 need.can 对某人有用,因此写它 here.My 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()

我的小例子,有执行时间限制和手动停止结果

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()