You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:20:28