我试图在componentWillMount()中从我的数据库中获取数据,它可以很好地与此配合使用:
var userData = null
firebase.database().ref('/users/' + user.uid).once('value').then(function(snapshot) {
userData = snapshot.val()
console.log(userData)
});
但是它仅在方法中起作用,我试图将值赋给变量,但是即使使用this.setstate我也无法将其获取。 我真的迷路了,看起来很简单,但我不知道如何... 感谢您的帮助。
答案 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)
});