Javascript 如何使用rxjs取消内部可观察计时器?

Javascript 如何使用rxjs取消内部可观察计时器?,javascript,rxjs,Javascript,Rxjs,我正试图用可观测的定时器制作一个简单的计数器。室外时间每5秒运行一次。内部计时器每秒钟运行一次,因为我想输出如下内容: 加载。。五, 加载。。四, 加载。。三, 但我的问题是,内在的可观察性并不抵消。它无限延续。正确的做法是什么 Observable.timer(0, 5000) .pipe( tap(() => { Observable.timer(0, 1000) .subscribe(t => console.log(5 - t));

我正试图用可观测的定时器制作一个简单的计数器。室外时间每5秒运行一次。内部计时器每秒钟运行一次,因为我想输出如下内容:

加载。。五,

加载。。四,

加载。。三,

但我的问题是,内在的可观察性并不抵消。它无限延续。正确的做法是什么

Observable.timer(0, 5000)
  .pipe(
    tap(() => {
      Observable.timer(0, 1000)
        .subscribe(t => console.log(5 - t));
    }),
    tap(t => {
      this.count = this.users.length;
    }),
  ).subscribe();
解决方案 使用switchMap操作符取消外部可观测值

Observable.timer(0, 5000)
  .pipe(
    switchMap(() => {
      return Observable.timer(0, 1000);
    }),
    tap(t => {
      console.log(`%c`, 'background:red', 5 - (t));
      this.count = this.users.length;
    }),
  ).subscribe();

我想您需要的是
take
操作符,请参阅[docs]以了解更多说明。您可以使用
take(5)
take(6)
,具体取决于您是要倒计时到0还是1

Observable.timer(0, 5000)
  .pipe(
    tap(() => {
      Observable.timer(0, 1000)
        .take(5)
        .subscribe(t => console.log(5 - t));
    }),
    tap(t => {
      this.count = this.users.length;
    }),
  ).subscribe();

你必须取消那个计时器的订阅。我用switchMap操作符解决了这个问题。谢谢