Firebase On Value获取状态反应挂钩

时间:2019-12-10 01:35:45

标签: reactjs firebase

我正在使用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时,我只会在事件内得到空值

2 个答案:

答案 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获取数据。