Javascript 如何将snapshot.val()中的数据提升到组件';什么州?
我正在制作一个带有firebase身份验证的登录按钮,该按钮引用promise中我的firebase实时数据库。当我试图提升该数据以更改组件状态时,它将变为null 我尝试了一种更简单的方法,在firebase引用之外声明一个变量,然后尝试在函数内设置该变量 我还尝试将“that”设置为空数组变量,然后将其作为数组访问 我尝试将“that”设置为this.state.ign,但当我尝试访问所需的数据时,它变为null **编辑-我还认为这是一个异步问题,所以在尝试在firebase引用之外的console.log之前,我使用了setTimeout 15000以允许15秒的时间Javascript 如何将snapshot.val()中的数据提升到组件';什么州?,javascript,reactjs,firebase,firebase-realtime-database,Javascript,Reactjs,Firebase,Firebase Realtime Database,我正在制作一个带有firebase身份验证的登录按钮,该按钮引用promise中我的firebase实时数据库。当我试图提升该数据以更改组件状态时,它将变为null 我尝试了一种更简单的方法,在firebase引用之外声明一个变量,然后尝试在函数内设置该变量 我还尝试将“that”设置为空数组变量,然后将其作为数组访问 我尝试将“that”设置为this.state.ign,但当我尝试访问所需的数据时,它变为null **编辑-我还认为这是一个异步问题,所以在尝试在firebase引用之外的co
var that = this;
firebase.database().ref("users/" + this.state.userid).on("value", function (snapshot) {
var userIGN = (snapshot.val().ign);
console.log(userIGN); // WORKS - gives ign from database
that.setState({ ign: userIGN }); // WORKS - sets that.state.ign to ign from database
console.log(that.state.ign); // WORKS - gives ign from that.state
})
console.log(that); // WORKS - shows object that has state with ign
console.log(that.state); // FAIL - shows state object, but ign is null now?!
第二个console.log(that.state.ign)应该显示firebase引用中的数据点事实证明,即使设置了15秒超时,我的互联网服务非常糟糕/不稳定,超时时间也不够长。我尝试了30秒,我能够访问数据
var that = this;
firebase.database().ref("users/" + this.state.userid).on("value", function (snapshot) {
var userIGN = (snapshot.val().ign);
console.log(userIGN); // WORKS - gives ign from database
that.setState({ ign: userIGN }); // WORKS - sets that.state.ign to ign from database
console.log(that.state.ign); // WORKS - gives ign from that.state
})
setTimeout(() => {
console.log(that); // WORKS - shows object that has state with ign
console.log(that.state.ign); // WORKS NOW!!
},30000);
可能是我尝试设置超时15000的重复。忘了列出我也试过了!哇,好吧,我把超时时间设为30000,现在可以了!所以这是一个异步问题!!互联网速度太快了*谢谢@FrankerZHold。你没抓住重点。Firebase是异步的,数据仅在闭包内有效。之后的代码将在数据从Firebase返回之前执行。不要依赖延迟或超时来获取数据——数据可能会有很大的差异。请参阅,甚至不要使用超时来处理异步性。相反:将任何需要数据的代码放入回调中。