Возврат значения из функции обратного вызова - PullRequest
0 голосов
/ 26 марта 2019

Я использую метод on () для получения снимка данных в нашей базе данных, но мне нужно иметь возможность сохранить это значение снимка, чтобы я мог использовать его для получения другого отдельного снимка.

Вот как выглядит наша база данных: База данных Firebase в реальном времени

Существует узел для пользователей и отдельный узел для устройств.У каждого пользователя есть дочерние «устройства», представляющие собой список устройств, связанных с этим пользователем.У пользователя, которого я расширил, есть только одно устройство.

Я пытаюсь сохранить это ID устройства, а затем выполнить отдельный запрос, чтобы найти это устройство в узле «Устройства».Вот как выглядит мой код:

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);

Где retrievedValue - идентификатор устройства, который я получил из первого запроса.

Возможно ли это сделать в javascript,или есть лучший способ?Я знаю, что подобные вопросы уже задавались, но я нашел, что все примеры, которые я видел онлайн, были действительно запутанными и не очень полезными для меня.Любая помощь будет очень признательна, потому что я застрял на этом.Спасибо!

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Вы должны узнать об обещаниях и асинхронном программировании. Вот два способа сделать то, что вы хотите:

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);
})

или с асинхронным ожиданием:

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);

Я более уверен во втором, поскольку я печатаю их без тестирования

Эти ссылки будут полезны, чтобы начать изучение этого материала: https://firebase.googleblog.com/2016/01/keeping-our-promises-and-callbacks_76.html https://firebase.google.com/docs/functions/terminate-functions

Редактировать: Я исправил приведенный выше код, заменив on на once. Однако теперь это больше не слушает изменения в БД. Чтобы исправить свой код для прослушивания изменений устройства пользователя:

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) // may need to place this before the code above
{ 
  currentDevice = Object.keys(data.val())[0];
  console.log("current device: " + currentDevice); 
  let deviceRef = database.ref("devices/").child(currentDevice);

  // no need to listen to this, as a change in one device would fire 
  // for every user. you probably don't want that. 
  deviceRef.once("value", (data) { 
    console.log(data);
  });
}
1 голос
/ 26 марта 2019

Для этого вам нужно изменить ваш обратный вызов следующим образом:

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}`)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...