在switchmap内进行http调用

时间:2019-06-16 22:49:40

标签: rxjs observable

我正在用Firebase身份验证和dotnet核心后端编写一个有角度的应用程序。我正在尝试创建一个服务,以便我可以跟踪firebase uid并跟踪用户是否是管理员(从后端服务器获取)。我可以毫无问题地从firebase成功获取uid,但是当我尝试从api中获取用户对象时,控制台出现错误。

enter image description here

这是我的用户服务代码:

export class UserService {
    uid = this.afAuth.authState.pipe(
        map(authState => {
            return !authState ? null : authState.uid;
        })
    );

    isAdmin = this.uid.pipe(
        switchMap(uid => {
            if (uid) {
                console.log("there is a uid")
                this.httpClient.get<User>("https://localhost:44337/api/users/" + uid).subscribe(data => {
                    console.log(data.isAdmin); // prints 'true'
                    return observableOf(data.isAdmin);
                });
            } else {
                return observableOf(false);
            }
        })
    );

    constructor(
        private afAuth: AngularFireAuth,
        private httpClient: HttpClient) { }
}

1 个答案:

答案 0 :(得分:1)

在switchMap运算符中,您不应直接订阅可观察对象。您应该返回observable,switchMap运算符将为您处理订阅。

switchMap(uid => {
            if (uid) {
                console.log("there is a uid")
                return this.httpClient.get<User>("https://localhost:44337/api/users/" + uid).pipe(map(data => {
                    console.log(data.isAdmin); // prints 'true'
                    return data.isAdmin
                }));
            } else {
                return of(false);
            }
        })