从回调函数返回值

时间:2019-03-26 15:59:49

标签: javascript firebase firebase-realtime-database

我正在使用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中执行此操作,或者有更好的方法吗?我知道已经问过类似的问题,但是我发现我在网上看到的所有示例确实令人困惑,对我没有太大帮助。任何帮助都将不胜感激,因为我对此有些执着。谢谢!

2 个答案:

答案 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