【发布时间】:2022-02-07 13:19:14
【问题描述】:
我正在尝试从 Firebase 上的 RealtimeDatabase 读取一个值并将其呈现在一个元素中,但它一直返回未定义。我有以下代码:
const getStudentName = (studentId) => {
firebase.database().ref('students').child(studentId).on("value", (snapshot) => {
return snapshot.val().name;
})
}
const StudentName = (studentId) => ( <p>{getStudentName(studentId)}</p> )
我知道数据库本身或我找到的值没有问题,因为如果我这样做:
const getStudentName = (studentId) => {
firebase.database().ref('students').child(studentId).on("value", (snapshot) => {
console.log(snapshot.val().name);
return "Test";
})
}
我仍然看到从我的数据库中按预期输出到控制台的正确名称,但“测试”没有返回到元素。但是,如果我这样做:
const getStudentName = (studentId) => {
firebase.database().ref('students').child(studentId).on("value", (snapshot) => {
console.log(snapshot.val().name);
})
return "Test";
}
然后“测试”返回到
元素并显示。我很困惑,因为我不明白如何在函数内部访问我的 console.log(),但是在它不会返回之后的“return”语句。
React 和 Firebase 新手,请帮忙!谢谢。
编辑:我确信这是不言自明的,但您可以假设一个简单的数据库形式为:
{ "students": [
"0": { "name": "David" },
"1": { "name": "Sally" } ]}
如果 'studentId' 为 0 则 'console.log(snapshot.val().name)' 成功输出 'David',但 'David' 不会返回
元素。
【问题讨论】:
-
您的 Firebase 调用是异步。你不能像你期望的那样直接从它返回。但是,有多种方法可以处理这种情况。 How to return the response from an asynchronous call
标签: reactjs firebase firebase-realtime-database react-hooks