如果我订阅了一个Observable,如果没有“ Subscription”类型的对象,该如何取消订阅?
如果我有类似的东西:
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;
}
});
}
我该如何退订?我什至需要退订吗?如果没有,为什么不呢?
答案 0 :(得分:2)
您实际上在这里提供了自己的答案:bla ...
是您的this.isLoggedIn$.subscribe( ... )
电话。
ngOnInit() {
this.isLoggedIn$ = this.authService.isLoggedIn();
this.subscription = this.isLoggedIn$.subscribe(res => {
if (res) {
this.isLoggedIn = true;
}
else {
this.isLoggedIn = false;
}
});
}
答案 1 :(得分:2)
有3种方法取消对可观察项的订阅
您可以将上述方法用作this.subscription
来分配订阅
为每个订阅,然后明确取消每个订阅。 (它
应该避免)
您可以通过以下示例使用takWhile管道 下方:
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;
}
使用takeUntil运算符:
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();
}
我希望这会有所帮助!
答案 2 :(得分:1)
在退订之前只需检查this.isLoggedIn $是否存在
ngOnDestroy() {
this.isLoggedIn$ && this.isLoggedIn$.unsubscribe();
}