Angular等待布尔函数完成

ami*_*ros 3 asynchronous angular-promise angular

我试图从我的firestore数据库中获取用户列表,并确定登录用户是否是管理员(即他在列表中).

这是我的代码:

isAdmin(user: any): boolean {
    var col = this.afs.collection('admins');
    var docRef = col.doc('mini-admins');
    docRef.ref.get().then(function (doc) {
      if (doc.data().user == user)
        return true;
    }).catch(function (error) {
      console.log("Error getting document:", error);
    });
    return false;
}
Run Code Online (Sandbox Code Playgroud)

但是,即使用户是管理员,该功能也不起作用.在继续之前,它似乎没有等待它完成.

我该如何解决?

Vit*_*vzh 7

它不起作用,因为它是异步的.要使其工作,您需要稍微更改为:

isAdmin(user: any): Observable<boolean> {
    return new Observable(observer => { 
       var col = this.afs.collection('admins');
       var docRef = col.doc('mini-admins');
       docRef.ref.get().then(function (doc) {
          if (doc.data().user == user) {
              observer.next(true);
              observer.complete();
          }   
       }).catch(function (error) {
          observer.error(error);
          observer.complete();
          console.log("Error getting document:", error);
       });
    });
}
Run Code Online (Sandbox Code Playgroud)

然后在您的代码中,当您想要检查用户是否为admin时,请按以下方式调用此函数:

this.isAdmin(user).subscribe(success => { ... }, error => { ... });
Run Code Online (Sandbox Code Playgroud)


Gün*_*uer 5

.then表示ref.get是一个异步函数。你不能等待异步函数。您只能返回从它返回的 Promise 或正确链接的新 Promise,并在调用者站点上传递另一个回调以在 Promise 完成时执行代码:

isAdmin(user: any): Promise<boolean> {
    var col = this.afs.collection('admins');
    var docRef = col.doc('mini-admins');
    // vvv added return
    return docRef.ref.get().then(function (doc) {
      return doc.data().user == user;
    }).catch(function (error) {
      console.log("Error getting document:", error);
    });
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

this.isAdmin(user).then(response => {
  if(response) {
    ...
  } else {
    ...
  }
});
Run Code Online (Sandbox Code Playgroud)