假设我不使用异步管道。我想在component.ts文件中订阅某些内容。如您所知,如果不是http请求,我应该退订自己。
这是我尝试过的。
方法1)实现ondestroy钩子并在那里取消订阅
方式2)订阅时,请使用take(1)。 take(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/。