(本机反应)无法从Firebase数据库方法中获取数据

时间:2019-03-13 23:44:26

标签: firebase react-native firebase-realtime-database expo

我试图在componentWillMount()中从我的数据库中获取数据,它可以很好地与此配合使用:

  var userData = null
firebase.database().ref('/users/' + user.uid).once('value').then(function(snapshot) {
        userData = snapshot.val()
        console.log(userData)
      });

但是它仅在方法中起作用,我试图将值赋给变量,但是即使使用this.setstate我也无法将其获取。 我真的迷路了,看起来很简单,但我不知道如何... 感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

once()是异步的,并以承诺立即返回。当您向其附加then回调时,promise不会阻止您的代码。直到数据库查询完成后,userData才会从promise填充到回调中,并且您无法保证何时进行填充。如果您的代码在最终填充userData之前尝试访问它,则它仍将具有其原始的空值。

答案 1 :(得分:0)

好吧,这是怎么回事,

您的firebase方法需要花费一些时间来获取数据,并且由于此处的所有操作都是异步的,因此javascript不会等到您的firebase方法执行完毕。

firebase.database()....的下一行将在此完成之前执行。

因此,您可能需要使用setState将数据设置为状态,或者可以使用类变量而不是局部变量。

执行此操作

constructor(props){
   super(props);
   this.state={
     data:null //either do this
   }
   this.localData=null; // or this
}


firebase.database().ref('/users/' + user.uid).once('value').then(function(snapshot) {
        this.setState({data:snapshot.val()});
        this.localData = snapshot.val();
        console.log(this.localData)
});