Angular Firestore:检查数据是否存在,并基于该数据更新全局变量

时间:2019-03-05 16:24:49

标签: javascript angular typescript function google-cloud-firestore

请求的行为
我想创建一个AngularService来检查某个文档是否存在,并根据结果更新全局变量。

当前状态
该功能成功检查文档的存在。它还会在if / else语句中更新全局变量。

问题
即使第一部分运行良好,也总是返回“ undefined”。

我该如何解决?与功能范围有关吗?

我的服务:

{{1}}

1 个答案:

答案 0 :(得分:1)

followDoc.get()是一个返回promise的异步函数。为了返回更新的this.followState,您必须等待then

一种方法是使用异步/等待

async checksFollow(followingID: string, followerID: string): boolean {
    const followDoc =
    this.angularFirestore.collection(`users/${followingID}/following`).doc(followerID).ref;

    return followDoc.get().then((doc) => {
      if (doc.exists) {
          this.followState = true;
      } else {
          this.followState = false;
      }

      return this.followState;
    }); 
  }

在代码的另一部分调用checksFollow时,可以放置关键字await并等待响应。

async someMethodToCallChecksFollow() {
    const result = await this.checksFollow();
    console.log(result);
}

如果您想在HTML中使用响应,我建议将followState从原始boolean更改为BehaviorSubject<boolean>,然后调用this.followState.next(true)

例如:

export class YourService {
  public followState = new BehaviorSubject<boolean>(false);

  async checksFollow(followingID: string, followerID: string): boolean {
    const followDoc =
    this.angularFirestore.collection(`users/${followingID}/following`).doc(followerID).ref;

    return followDoc.get().then((doc) => {
      if (doc.exists) {
          this.followState.next(true);
      } else {
          this.followState.next(false);
      }

      return this.followState.getValue();
    }); 
  }
}

然后在您的html中,您可以使用async管道。

<div *ngIf="yourServiceInstance.followState | async">It is true</div>