我正在尝试获取登录用户的详细信息。我需要将数据置于状态并使用相同的状态进行进一步处理,需要花费一些时间将数据置于状态并使用此数据。将状态与该数据一起使用几乎需要2到3秒。
如果我们使用setTimeOut()
函数3秒钟,以便我们这次可以更新数据,则可以解决此问题。如果我们不使用setTimeOut()
并在更新后使用状态wright,那么它将提供状态的初始数据。
complete_date = date + ":" + month + ":" + year;
var query = firebase.database().ref('attendence/'+ complete_date +"/").orderByKey();
email_match=false;
entry_time =null,
l_id = null,
query.on("value",(data)=>
{
data.forEach(function(childs)
{
l_id = childs.key;
// __ to check if the user already loged in before.
var att_query = firebase.database().ref('attendence/'+ complete_date +"/"+ l_id).orderByKey();
att_query.once("value",(data)=>
{
if(email == data.child('email').val())
{
email_match = true;
entry_time = data.child('timeEntry').val();
}
}); //
}); //
this.setState({ last_id:l_id });
this.setState({ emailMatchState:email_match });
this.setState({alreayLogedState : entry_time});
}); // _____end of query.on("value",(data)=>
setTimeout(() =>
{
console.log("-----------------------------------");
console.log("already logged :",this.state.alreayLogedState," email match :",this.state.emailMatchState , " result : ", this.state.result , " last_id :",st.last_id);
console.log("-----------------------------------");
},3000);
我需要在更新后不使用setTimeout()
的情况下使用状态,以便更快地运行应用程序。
答案 0 :(得分:3)
setState
的第二个参数是在完成所有更新后执行的callback
this.setState({ last_id:l_id }, () => console.log(this.state.last_id))
答案 1 :(得分:1)
setState带有一个可选的第二个参数,该参数在对状态对象进行更新之后被调用。
示例:
let callback = () => {
// do something
}
this.setState({
keyToUpdate: valueToUpdate
}, callback)
有关此回调的用法的其他阅读: https://medium.learnreact.com/setstate-takes-a-callback-1f71ad5d2296?gi=18aa91e88437
此外,除非在单独的调用之间发生任何事情,否则这些:
this.setState({ last_id:l_id });
this.setState({ emailMatchState:email_match });
this.setState({alreayLogedState : entry_time});
可以简化为:
this.setState({
last_id:l_id,
emailMatchState: email_match,
alreayLogedState: entry_time
}); //optionally add callback