如何在Angular2中停止observable.timer

时间:2017-05-18 05:28:40

标签: javascript angular typescript rxjs rxjs5

我在Angular2的Component中实现了以下功能:

export class MypageEditComponent {

  ngOnInit() {
    this.timer = Observable.timer(100, 100);
    this.timer.subscribe(t => {
      this.setFormData();
  }


  private setFormData() {
    this.editUserAcountType = this.authStore.registerInfo.account_type;
    this.editAddress = this.authStore.registerInfo.email;
    this.editUserName = this.authStore.registerInfo.username;
  }
}

我想在Observable.timer正确存储值后停止重复setFormData()

但不知道怎么回事,请告诉我。

5 个答案:

答案 0 :(得分:36)

基本上有两种方式:

  • unsubscribe()来电回复的订阅对象上调用subscribe()
  • 使用运营商

只需unsubscribe就可以这样做。

ngOnInit() {
  this.subscription = timer(100, 100).subscribe(t => {
    this.setFormData();
  });
}

private setFormData() {
  ...
  this.subscription.unsubscribe();
}

或者您可以使用Subject通过takeUntil()运算符完成Observable:

this.subject = new Subject();

ngOnInit() {
  timer(100, 100).pipe(
    takeUntil(this.subject),
  ).subscribe(t => this.setFormData());
}

private setFormData() {
  ...
  this.subject.next();
}

看看这些:

2019年1月:更新了RxJS 6

答案 1 :(得分:10)

当你想要像这样停止计时器时,可以使用unsubscribe方法

this.timer = Observable.timer(100, 100);
this.subscription = this.timer.subscribe(t => {
    this.setFormData();
});

.............
this.subscription.unsubscribe();

答案 2 :(得分:1)

以前的答案尚未真正解决的一个细微差别是,无需停止可观察的计时器/时间间隔-至少不需要与可观察的计时器或计时器本身进行交互。

我之所以来到这里,是因为我在HostedService的start方法中使用计时器设置了一个可观察对象,而在stop方法中,它似乎就像我应该停止它或处置它一样。当然可以吗?好吧可观察的计时器不需要以这种方式停止或处置,仅需要订阅即可,这就是为什么...

可观察的计时器和间隔是冷流的示例(尽管它们看起来像是高温的)。它们是被动的而不是主动的,它们直到订阅后才产生数据,而在没有订阅者时停止产生数据。因此,应该停止计时器的所有工作,以处理所有订阅。

此处有更多信息... [http://introtorx.com/Content/v1.0.10621.0/14_HotAndColdObservables.html]

答案 3 :(得分:0)

xD您知道您可以兑现诺言吗?

import { timer } from 'rxjs';

timer(1000).toPromise().then(res => {
      //code here  
})

无需处理退订。

答案 4 :(得分:0)

-解决方法

setTimeout(() => observable.next(null) , 2000);