【发布时间】:2021-09-26 09:57:23
【问题描述】:
我对@987654322@ 有一个普遍的困惑。
我想要达到的目标:
- 等待
fireAuthUser$Observable 有值 - 一旦发生,做一些事情
- 如果
fireAuthUser$Observable 没有收到值,则在组件离开后取消
export class AuthService implements OnDestroy {
fireAuthUser: BehaviorSubject<firebase.User | undefined> = new BehaviorSubject<firebase.User | undefined>(undefined);
public readonly fireAuthUser$: Observable<firebase.User | undefined> = this.fireAuthUser.asObservable();
private subscription?: Subscription;
constructor(public fire: AngularFireAuth) {
this.subscription = this.fire.authState.subscribe((fireAuthUser) => {
if (fireAuthUser) {
this.fireAuthUser.next(fireAuthUser);
// ...
}
});
}
ngOnDestroy(): void {
this.subscription?.unsubscribe();
}
doSomeStuff(): void {
//do some stuff
}
}
export class Foo implements OnInit {
constructor(public auth: AuthService) { }
ngOnInit(): void {
this.auth.fireAuthUser$.pipe(takeWhile((fireAuthUser) => fireAuthUser === undefined)).subscribe({
complete: () => this.auth.doSomeStuff()
});
}
}
上面的代码有效。但是,根据Angular/RxJS When should I unsubscribe from `Subscription` 使用takeWhile,在组件的ngDestroy 上不会取消可观察执行。所以根据我的理解,我需要在我的ngOnDestroy 中手动设置一个.next 值,否则我的takeWhile 永远不会取消?用例是,即,如果用户无法登录(不存在fireAuthUser)
但是,我想我不能简单地放一个ngOnDestroy(): void { this.auth.fireAuthUser.next(undefined); },因为这总是会删除我的fireAuthUser,如果用户确实有一个fireAuthUser 对象,这是一个问题吗?那么在这种情况下我应该怎么做呢?还是我误解了这句话,我的代码可以安全使用?
【问题讨论】:
-
为什么不能直接实现
OnDestroy保存订阅并取消订阅?
标签: angular typescript rxjs