take(1)和取消订阅

时间:2019-02-11 20:51:35

标签: angular rxjs observable

假设我不使用异步管道。我想在component.ts文件中订阅某些内容。如您所知,如果不是http请求,我应该退订自己。

这是我尝试过的。

方法1)实现ondestroy钩子并在那里取消订阅

方式2)订阅时,请使用take(1)。 take(1)会自行取消订阅。

我的问题是-为什么有人会选择方式1,而当我们想要取消订阅时(如果我们不需要异步管道)我们应该使用哪种方式

1 个答案:

答案 0 :(得分:0)

答案与Angular生命周期有关。

方法1.实施OnDestroy钩子并在那里取消订阅:

您的组件会执行类似的操作,很可能是在OnInit方法中进行的。

this.myObservable$.pipe(takeUntil(this.unsubscribe)).subscribe(myValue => {
  // do something
});

,您有一个对应的私有变量和OnDestroy生命周期钩子要取消订阅:

private unsubscribe: Subject<void> = new Subject();

ngOnDestroy(): void {
  this.unsubscribe.next();
  this.unsubscribe.complete();
}

当您希望订阅在组件的整个生命周期中持续存在时,可以使用此选项。当您的观察对象接收到新值时,您的订阅将继续接收它们。

方法2.订阅时,请使用take(1)

this.myObservable$.pipe(take(1)).subscribe(myValue => {
  // do something
});

这种方式将获取第一个发射信号,并取消其可观测的订阅。当然,如果此后该值发生更改,则不会通知您更改。

方法1将帮助您维持动态状态。假设您有一个菜单,并且想要在该菜单上选择一个选项,则希望此组件在更改时进行更新,并且您需要做的任何事情都非常复杂,您无法使用异步管道。该订阅将在组件的整个生命周期内持续。

根据您要执行的操作,您可能根本不需要订阅。相反,您可以使用rxjs运算符自动执行此工作。例如,请参见https://brianflove.com/2017/11/01/ngrx-anti-patterns/