1

每當我運行以下代碼時,從checkIfUserHasMadeBet()函數返回的值始終爲空。看起來代碼並沒有等待函數返回值,而是跳過了前面。如何讓它等待函數從Firebase數據庫返回數據?爲什麼始終從functio返回的值爲null或未定義?

export class DisplayBetPage { 
    hasCurrentUserMadeAbet: boolean = false; 

    constructor(private navParams: NavParams, public navCtrl: NavController, private afAuth: AngularFireAuth, private afDatabase: AngularFireDatabase, public alertCtrl: AlertController) { 
    } 

    ionViewWillLoad() { 
     var temp = this.checkIfUserHasMadeBet(); 
     console.log(temp); // comes out as null 
     if (temp != null) { 
     this.hasCurrentUserMadeAbet = true; 
     } 
    } 

    checkIfUserHasMadeBet() { 
     this.afAuth.authState.take(1).subscribe(auth => {  
      this.afDatabase.database 
      .ref(`userprofile/${auth.uid}/bets/${this.bettingKey}`) 
      .once(`value`).then(function(snapshot) { 
       console.log(snapshot.val()); 
       // comes out with correct value [not null] 
       return snapshot.val(); 
      }); 
     }); 
    } 
} 

回答

3

var temp = this.checkIfUserHasMadeBet();是一個異步調用和你正在做的console.log(temp);是在同步上下文,以便之後立即致電值不解決,爲空。

UPDATE

有一些事情是錯誤的方式努力實現這一目標首先,最好是有一個服務有這種業務,而不是組件本身有它。

該組件將調用服務方法,將快照值保存在服務的subjectbehaviour subject中,那麼您的組件將訂閱該服務observable獲取訂閱中的快照值並執行所有必要的操作。

看一看@此link - 而不是使用Observable使用Behavior Subject或Replay Subject在組件之間傳遞數據(共享服務)。

按照這種方法將值傳遞給同一個組件,上面的鏈接就像是一個讓你遵循而不是實際答案的要點。在你的場景中不會有觀察或更新組件,這兩個組件都是一個。

+1

在observable中還有嵌套的異步調用,這使得很難處理。我建議OP在RxJS上閱讀其操作員的權力,以便毫無問題地使用它們。 –

+0

好的,非常感謝,所以我如何使它異步等待電話完成? –

+0

@AdamGoldberg更新了你如何獲得價值的藍圖 –