使用RxJS响应式编程如何获取用户关联的Organization实体?
Angular中switchMap订阅的取消问题
背景
我有Organization和User两个实体,组件中可以通过以下方式获取当前已认证用户:
// component.ts public authenticatedUser$ = this._authService.authenticatedUser$.pipe( tap((user) => { console.log('authenticatedUser$: ', user); // {id: '123', organizationId: '456',...} }), catchError((err) => { return EMPTY; }) );
尝试获取用户所属Organization的错误写法
我想获取该用户所属的Organization,试了多种写法都没成功:
// component.ts // private _organizationSubject:Subject<IOrganization>(); // public organization$ = this._organizationiSubject.asObservable(); public organization$ = this.authenticatedUser$.pipe( map( (user) => tap((user) => { console.log('user', user); }) // this._organizationService.getOrganization(user.organizationId) // this._organizationSubject.next([--response from service--]); ), catchError((err) => { return EMPTY; }) ); ... ngOnInit(): void { // actual call(s) need to go here... this.authenticatedUser$ .pipe( tap((user) => console.log('user: ', user)), tap((user) => { this._organizationService.getOrganization( user.organizationId ); }), catchError((err) => { return EMPTY; }) ) .subscribe(); }
我意识到自己的map操作有误,参考Deborah Kurata的视频尝试声明式数据流写法,但遇到了困难。
已实现功能但有疑问
后来我实现了功能,但不理解原理:
// component.ts public authenticatedUser$ = this._authService.authenticatedUser$.pipe( catchError((err) => { return EMPTY; }) ); ... ngOnInit(): void { this.authenticatedUser$ .pipe( switchMap((user) => this._organizationService .getOrganization(user.organizationId) .pipe(tap((data) => console.log('data: ', data))) // {id: '123', name: 'My Org', ...} ), catchError((err) => { return EMPTY; }) ) .subscribe(); }
核心问题:使用switchMap后,是否需要在ngOnDestroy方法中手动取消订阅?
内容的提问来源于stack exchange,提问作者Damon
相关产品推荐
相关产品推荐

