javascript - 从我的 firebase 数据库获取数据时,如何正确使用 async 和 await?
问题描述
我需要从我在 firebase 中的实时数据库中获取 json 数据并为其设置一个变量。我尝试在下面的代码中这样做
useEffect(() => {
let database = firebase.database();
database.ref().on('value', async (snapshot) => {
await setQuestions(snapshot.val());
console.log('questions here ', questions)
})
},[]);
console.log 在此处输出问题 null,而不是记录实际数据。我知道这是一个涉及行执行顺序的问题,因为我已经证明我实际上是从数据库中提取数据。它只是没有完成将它拉到我需要的地方。据我了解, await 将在 async 块内停止执行,直到带有 await 的代码行完成。然而,这并没有发生。所以要么我误解了异步函数的工作原理,要么我没有将 async 或 await 关键字放在我需要的地方。任何帮助表示赞赏。
编辑:问题已定义。在我的代码中,它如下所示
const [questiona, setQuestions] = useState(null);
解决方案
await
除非 RHS 上的值是承诺,否则无效。
setQuestions
useState
是,我假设,一个钩子的集合部分。它不返回承诺。
(如果确实如此,那么questiona
变量(我假设它是该挂钩的数据部分)无论如何都不会在当前范围内更新。)
如果你想看看是什么questiona
,那么在你正在使用的 React 组件的下一次渲染中记录它。
const [questiona, setQuestions] = useState(someDefaultValue);
console.log(questiona);
useEffect(() => {
let database = firebase.database();
database.ref().on(
'value',
(snapshot) => setQuestions(snapshot.val())
);
},[]);
推荐阅读
- javascript - History.pushState() 在 YouTube 页面上不起作用
- javascript - 是否使用 FormData 以不同的方式序列化嵌套在数组中的对象?
- java - spring boot不加载jsp文件
- javascript - 如何在 php 中接收 Fetch() POST?
- kubernetes - 无法访问 Traefik 仪表板,获得 404。从 Helm 图表安装在 Kubernetes (k3d) 上(在 Ubuntu 20.04 笔记本电脑上)
- python - 从 PiCamera 环形缓冲区读取最后一帧
- react-native - 为什么世博会后台位置在 5 分钟后停止发送位置?
- c# - 在 XML 异常处理期间,如何获取导致异常的 XML 文件中的行号?
- reactjs - Typescript 无法解析 react-router-dom
- c - 将终端附加到作为守护进程运行的进程(以运行 ncurses UI)