我正在使用on()方法来检索数据库中的数据快照,但是我需要能够存储此快照值,以便可以使用它来检索另一个单独的快照。
这是我们数据库的外观: Firebase Real-Time Database
有一个用于用户的节点,一个用于设备的单独节点。每个用户都有一个子“设备”,它是与该用户关联的设备列表。我扩展的用户只有一个设备。
我要执行的操作是存储该deviceID,然后执行单独的查询以在“设备”节点中找到该设备。这是我的代码:
let uid = fireBaseUser.uid;
//get a reference to the database
let database = firebase.database();
let ref = database.ref("users/").child(uid).child("devices");
ref.on("value", getData);
然后回调函数如下所示:
function getData(data)
{
currentDevice = Object.keys(data.val())[0];
console.log("current device: " + currentDevice);
}
只是获取用户设备列表中的第一台设备并将其打印到控制台。我试图弄清楚如何 返回此值,以便在从“设备”树中获取数据时可以使用它。我猜, 看起来像这样:
let deviceRef = database.ref("devices/").child(retrievedValue);
deviceRef.on("value", getData2);
recoveredValue是我从第一个查询中获得的deviceID。
是否可以在javascript中执行此操作,或者有更好的方法吗?我知道已经问过类似的问题,但是我发现我在网上看到的所有示例确实令人困惑,对我没有太大帮助。任何帮助都将不胜感激,因为我对此有些执着。谢谢!
答案 0 :(得分:1)
为了实现这一点,您必须修改回调,如下所示:
function getData(data, callback)
{
currentDevice = Object.keys(data.val())[0];
console.log("current device: " + currentDevice);
callback(currentDevice)
}
然后我们从代码中调用回调,如下所示:
let uid = fireBaseUser.uid;
//get a reference to the database
let database = firebase.database();
let ref = database.ref("users/").child(uid).child("devices");
ref.on("value", getData((this_is_the_value_from_inside_callback) => {
console.log(`your value: ${this_is_the_value_from_inside_callback}`)
});
您也可以尝试运行此小片段(我使用了PlayCode),以查看更友好的测试环境
somefunction = (data, callback) => {
console.log(`data: ${data}`)
data += 100
console.log(`data: ${data}`)
callback(data)
}
somefunction(100, (dataReturned) => {
console.log(`data returned: ${dataReturned}`)
})
答案 1 :(得分:1)
您必须了解Promise和异步编程。这是两种您可以做的事情:
list
或使用async / await:
let uid = fireBaseUser.uid;
//get a reference to the database
let database = firebase.database();
let ref = database.ref("users/").child(uid).child("devices");
ref.once("value").then((data) {
currentDevice = Object.keys(data.val())[0];
console.log("current device: " + currentDevice);
let deviceRef = database.ref("devices/").child(currentDevice);
return deviceRef.once("value");
}).then((value) {
console.log("value is " + value);
})
我对第二个更自信,因为我无需测试即可输入这些内容。
这些链接将有助于您开始学习以下内容: https://firebase.googleblog.com/2016/01/keeping-our-promises-and-callbacks_76.html https://firebase.google.com/docs/functions/terminate-functions
编辑:我通过将let uid = fireBaseUser.uid;
//get a reference to the database
let database = firebase.database();
let ref = database.ref("users/").child(uid).child("devices");
let data = await ref.once("value")
currentDevice = Object.keys(data.val())[0];
console.log("current device: " + currentDevice);
let deviceRef = database.ref("devices/").child(currentDevice);
let value = await deviceRef.once("value");
console.log("value is " + value);
替换为on
来修复了上面的代码。但是现在,它不再监听数据库中的更改。要更正您的代码以侦听用户的设备更改:
once