簡體   English   中英

Angular等待布爾函數完成

[英]Angular Wait for boolean function to finish

我試圖從我的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;
}

但是,即使用戶是管理員,該功能也不起作用。 在繼續之前,它似乎沒有等待它完成。

我該如何解決?

它不起作用,因為它是異步的。 要使其工作,您需要稍微更改為:

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);
       });
    });
}

然后在您的代碼中,當您想要檢查用戶是否為admin時,請按以下方式調用此函數:

this.isAdmin(user).subscribe(success => { ... }, error => { ... });

.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);
    });
}

然后像使用它一樣

this.isAdmin(user).then(response => {
  if(response) {
    ...
  } else {
    ...
  }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM