我想从Google Firebase获取登录用户的用户数据。
为此,我编写了两种方法:一个获取Header
,另一个获取包含更详细信息的Content
。
这是在称为authState
的服务中实现的两种方法:
UserInfo
我正在从组件中实现的按钮事件处理程序中调用UserService
方法。
该按钮的html元素如下所示:
constructor(private fireStore: AngularFirestore, private fireAuth: AngularFireAuth) {
}
public async getAuthorizedUser(): Promise<UserInfo> {
console.log('Awaiting Promise');
const user: firebase.User = await this.fireAuth.authState.toPromise();
console.log('User', user);
return this.getUserInfo(user.uid);
}
private async getUserInfo(uid: string): Promise<UserInfo> {
return this.fireStore.collection('users', ref => ref.where('uid', '==', uid))
.get()
.pipe(
map((item: firebase.firestore.QuerySnapshot) => new UserInfo(item.docs[0].data(), item.docs[0].id))).toPromise();
}
和getAuthorizedUser
方法实现为:
<button mat-button (click)="test()">test</button>
此外,test()
是注入的async test() {
console.log('Starting Test');
const testVariable = await this.userService.getAuthorizedUser();
console.log('Test', testVariable);
}
依赖项。
控制台显示:
开始测试
等待承诺
因此在我看来,异步调用根本没有返回,因为我希望看到日志记录
测试
或
用户{...}
或两者都有。
怎么了?
修改-部分答案:
在angularfirebase.com上进行了更多Google研究之后,应将authState称为
userService
但是这使我感到困惑,因为在决定更改为可观察变量而不是普通变量之前,我使用了以下代码。该代码有效,但是我看不到UserService
const user: firebase.User = await this.fireAuth.authState.pipe(first()).toPromise();
正在发生什么,为什么我的解决方案有效?
答案 0 :(得分:0)
toPromise()
创建一个承诺,该承诺将在流完成时解决。
因此,如果this.fireAuth.authState
从未完成,但是发出了值,则可以使用first
运算符来创建在第一个发出值之后完成的流。这样,诺言就解决了。
另一方面,将为每个值调用订阅处理程序。