如果我订阅了可观察对象,如果没有“订阅”类型的对象,我如何取消订阅?
如果我有类似的东西:
this.subscription = bla ...
然后我可以按如下方式取消订阅它(在ngOnDestroy()-方法中):
this.subscription.unsubscribe();
但是如果我有这样的东西呢:
ngOnInit() {
this.isLoggedIn$ = this.authService.isLoggedIn();
this.isLoggedIn$.subscribe(res => {
if (res) {
this.isLoggedIn = true;
}
else {
this.isLoggedIn = false;
}
});
}
我如何取消订阅?我甚至必须取消订阅吗?如果没有,为什么不呢?
有3种方法可以取消订阅可观察的
>
您可以使用上述方法作为this.订阅
为每个订阅分配订阅,然后显式取消订阅。(应该避免)
您可以使用以下示例使用tak同时管道:
private isAlive = true;
ngOnInit() {
this.isLoggedIn$ = this.authService.isLoggedIn();
this.subscription = this.isLoggedIn$
.pipe(takeWhile(() => this.alive))
.subscribe(res => {
if (res) {
this.isLoggedIn = true;
}
else {
this.isLoggedIn = false;
}
});
}
ngOnDestroy() {
console.log('[takeWhile] ngOnDestory');
this.alive = false;
}
使用取值运算符:
private unsubscribe: Subject<void> = new Subject();
ngOnInit() {
this.isLoggedIn$ = this.authService.isLoggedIn();
this.subscription = this.isLoggedIn$
.pipe(takeUntil(this.unsubscribe))
.subscribe(res => {
if (res) {
this.isLoggedIn = true;
}
else {
this.isLoggedIn = false;
}
});
}
ngOnDestroy() {
this.unsubscribe.next();
this.unsubscribe.complete();
}
我希望这有帮助!!
您实际上已经在这里提供了自己的答案:bla…
是您的this. isLoggedIn$.订阅(…)
调用。
ngOnInit() {
this.isLoggedIn$ = this.authService.isLoggedIn();
this.subscription = this.isLoggedIn$.subscribe(res => {
if (res) {
this.isLoggedIn = true;
}
else {
this.isLoggedIn = false;
}
});
}
退订前检查this. isLoggedIn$是否存在
ngOnDestroy() {
this.isLoggedIn$ && this.isLoggedIn$.unsubscribe();
}