web-dev-qa-db-ja.com

Angular2でobservable.timerを停止する方法

Angular2のコンポーネントに次の機能を実装しています。

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

値がsetFormData()で正しく保存されたら、_Observable.timer_の繰り返しを停止したいです。

しかし、方法がわからない、教えてください。

20
xKxAxKx

基本的に2つの方法があります:

  • unsubscribe() callから返されたSubscriptionオブジェクトで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用に更新

40
martin

このように監視可能なタイマーを停止する場合は、unsubscribeメソッドを使用できます

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

.............
this.subscription.unsubscribe();
11
Pardeep Jain

これまでの回答では実際にはカバーされていなかったニュアンスは、監視可能なタイマー/間隔をstopする必要がないことです-少なくとも、監視可能オブジェクトまたはタイマー自体と対話する必要はありません。

HostedServiceのstartメソッドでタイマーを使用してobservableを設定し、stopメソッドでそれをseemed私はそれを止めるべきなのか、何かを確実に処分するべきなのか? - うーん、ダメ。監視可能なタイマーは、このように停止または破棄する必要はなく、サブスクリプションのみです。これが理由です...

観察可能なタイマーと間隔は、コールドストリームの例です(ホットとして動作するように見えますが)。アクティブではなくパッシブであり、サブスクライブされるまでデータを生成せず、サブスクライバーがいない場合はデータの生成を停止します。したがって、タイマーを停止してデータを生成するために必要なのは、すべてのサブスクリプションの破棄のみです。

詳細はこちら... [ http://introtorx.com/Content/v1.0.10621.0/14_HotAndColdObservables.html]

1
controlbox