Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将snapshot.val()中的数据提升到组件';什么州?_Javascript_Reactjs_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript 如何将snapshot.val()中的数据提升到组件';什么州?

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

我正在制作一个带有firebase身份验证的登录按钮,该按钮引用promise中我的firebase实时数据库。当我试图提升该数据以更改组件状态时,它将变为null

我尝试了一种更简单的方法,在firebase引用之外声明一个变量,然后尝试在函数内设置该变量

我还尝试将“that”设置为空数组变量,然后将其作为数组访问

我尝试将“that”设置为this.state.ign,但当我尝试访问所需的数据时,它变为null

**编辑-我还认为这是一个异步问题,所以在尝试在firebase引用之外的console.log之前,我使用了setTimeout 15000以允许15秒的时间

 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返回之前执行。不要依赖延迟或超时来获取数据——数据可能会有很大的差异。请参阅,甚至不要使用超时来处理异步性。相反:将任何需要数据的代码放入回调中。