异步方法不返回值,并且被卡住

时间:2019-04-07 10:52:05

标签: angular typescript async-await firebase-authentication google-cloud-firestore

我想从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();

正在发生什么,为什么我的解决方案有效?

1 个答案:

答案 0 :(得分:0)

toPromise()创建一个承诺,该承诺将在流完成时解决。

因此,如果this.fireAuth.authState从未完成,但是发出了值,则可以使用first运算符来创建在第一个发出值之后完成的流。这样,诺言就解决了。

另一方面,将为每个值调用订阅处理程序。