每当我运行以下代码时,checkIfUserHasMadeBet()函数返回的值总是为null。似乎代码不是在等待函数返回值而是等待跳过。如何让它等待函数从firebase数据库返回数据?
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();
});
});
}
}
答案 0 :(得分:3)
var temp = this.checkIfUserHasMadeBet();
是异步调用,您正在执行的console.log(temp);
处于同步上下文中,因此在该调用之后,该值不会被解析且为null。
<强>更新强>
有一些事情是错误的,首先要尝试实现这一点,最重要的是让服务进行这种操作而不是将其放在组件本身中。
组件将调用服务方法,该方法将快照值保存在服务的subject
或behaviour subject
中,然后您的组件将订阅该服务observable获取订阅中的快照值并执行所有必要的操作。
看看@ this link - 而不是使用Observables使用行为主题或重播主题在组件之间传递数据(共享服务)。
按照这种方法将值传递给同一个组件,上面的链接就像一个要点,让你不遵循实际的答案。在您的场景中,没有观察或更新组件这两个组件都是一个组件。