为什么始终从函数返回的值为null或未定义?

时间:2017-08-26 06:08:16

标签: angular typescript ionic-framework firebase-realtime-database firebase-authentication

每当我运行以下代码时,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();
          });
       });
   }
}

1 个答案:

答案 0 :(得分:3)

var temp = this.checkIfUserHasMadeBet();是异步调用,您正在执行的console.log(temp);处于同步上下文中,因此在该调用之后,该值不会被解析且为null。

<强>更新

有一些事情是错误的,首先要尝试实现这一点,最重要的是让服务进行这种操作而不是将其放在组件本身中。

组件将调用服务方法,该方法将快照值保存在服务的subjectbehaviour subject中,然后您的组件将订阅该服务observable获取订阅中的快照值并执行所有必要的操作。

看看@ this link - 而不是使用Observables使用行为主题或重播主题在组件之间传递数据(共享服务)。

按照这种方法将值传递给同一个组件,上面的链接就像一个要点,让你不遵循实际的答案。在您的场景中,没有观察或更新组件这两个组件都是一个组件。