我正在使用firebase和react hooks,我的问题是我需要检查我拥有的driverId是否仍在驱动程序列表中,但问题是在事件内部,即使inputs.driverId为null它已经有一个值,如果“打印”输入变量,则所有字段都像我声明初始状态时一样。
const initialState = {
driverId:'',
drivers: []
};
const [inputs, setInputs] = useState(initialState);
const getDrivers = () => {
const self = this;
const nameRef = firebase.database().ref().child('drivers').orderByChild('status');
nameRef.on('value', snapshot => {
var drivers = snapshot.val();
setInputs(inputs => ({...inputs, ['drivers']: drivers}));
console.log('dtiverId', inputs.driverId) // console response: dtiverId
})
}
可以帮助我的任何东西,我需要在事件执行时检查选择的驱动程序(driverId)是否仍在列表中,但是当我检查driverId时,我只会在事件内得到空值
答案 0 :(得分:2)
firebase.database()
是一个异步调用。您需要像这样添加异步并等待
const getDrivers = aysnc () => {
const self = this;
const nameRef = await firebase.database().ref().child('drivers').orderByChild('status');
nameRef.on('value', snapshot => {
var drivers = snapshot.val();
setInputs(inputs => ({...inputs, ['drivers']: drivers}));
console.log('dtiverId', inputs.driverId) // console response: dtiverId
})
}
代码中发生的事情是,您尝试在从firebase返回驱动程序ID之前使用它(这就是为什么它为null)。异步将阻塞,直到firebase返回,然后您的代码才能继续执行。
答案 1 :(得分:0)
firebase实时数据库异步工作。 您应该利用异步等待或承诺来获取数据。
firebase docs展示了如何使用Promise获取数据。