【发布时间】:2021-11-18 20:37:49
【问题描述】:
我有一个简单的身份验证服务和另一个组件 Foo,它执行以下操作:
- 获取一些数据(两个列表)
- 使用这些列表,订阅 auth login observable 以获取更多数据
export class AuthService implements OnInit {
login: BehaviorSubject<Login | undefined> = new BehaviorSubject<Login | undefined>(undefined);
public readonly login$: Observable<Login | undefined> = this.login.asObservable();
constructor(private httpService: HttpHandlerService) { }
ngOnInit(): void {
this.httpService.login().subscribe(
(login: Login) => {
this.login.next(login);
});
}
}
export class Foo implements OnInit {
subscription?: Subscription;
listA?: KeyValuePair[];
listB?: KeyValuePair[];
constructor(private httpHandlerCached: HttpHandlerCachedService, private auth: AuthService) {
}
ngOnInit(): void {
this.initLists().subscribe(([listA, listB]) => {
this.listA = listA;
this.listB = listB;
this.initModule();
});
}
initLists(): Observable<[KeyValuePair[], KeyValuePair[]]> {
return forkJoin([
this.httpHandlerCached.getAllListA(),
this.httpHandlerCached.getAllListB()
]);
}
initModule(): void {
this.auth.login$.subscribe((login) => {
if (login) {
this.httpHandler.getSomeData(login.id)
.subscribe(someData => doSomeStuff(someData, listA, listB));
}
})
}
}
我的尝试:
export class Foo implements OnInit, OnDestroy {
listA?: KeyValuePair[];
listB?: KeyValuePair[];
subscription?: Subscription;
constructor(private httpHandlerCached: HttpHandlerCachedService, private auth: AuthService) { }
ngOnInit(): void {
this.subscription = this.initLists().subscribe(([listA, listB]) => {
this.listA = listA;
this.listB = listB;
this.initModule();
});
}
initLists(): Observable<[KeyValuePair[], KeyValuePair[]]> {
return forkJoin([
this.httpHandlerCached.getAllListA(),
this.httpHandlerCached.getAllListB()
]);
}
initModule(): void {
this.subscription = this.auth.login$.subscribe((login) => {
if (login) {
this.httpHandler.getSomeData(login.id)
.subscribe(someData => doSomeStuff(someData, listA, listB));
}
})
}
ngOnDestroy() {
this.subscription?.unsubscribe();
}
}
我的问题:
- 这是分配两个订阅的正确方法吗?
- 在这两种情况下我都需要退订吗?
谢谢!
【问题讨论】:
-
您将在第二次调用中覆盖 this.subscription ,因此无论如何这都行不通。但是,整个方法并不真正正确。你真的不应该嵌套订阅。阅读 switchMap 和其他 rxjs 操作符。这种情况下的 switchMap 可以防止嵌套订阅。
标签: angular typescript rxjs