JavaScript - значение Firebase для глобальной переменной - PullRequest
0 голосов
/ 24 августа 2018
ref.child("path").on("value", snapshot => {
  var z = Object.keys(snapshot.val())[2];
  y = snapshot.val()[z];

  //Call the friggin thing
  exportData(y);

  function exportData(y) {
    exporting(y);
  }
});

function exporting(y) {
  var x = y;
  //console.log(y);
  return x;
}

Я хочу сохранить x в глобальной переменной.

Я не могу сделать код чуть ниже, потому что 'y' не будет передано.'y' - локальная переменная.

var answer = exporting();
answer();

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Я нашел решение, используя jQuery

ref.child("path").on("value", snapshot => {
  var y = Object.keys(snapshot.val())[2];
  z = snapshot.val()[y];
  $("#id").attr("data-stored", z);
  updateVal();
});

var x;
function updateVal() {
  x = parseFloat($("#id").attr("data-stored"));
}

console.log("It Works! " + x);
0 голосов
/ 25 августа 2018

Сохранение значения в глобальной переменной не проблема, это , когда сбивает вас с толку.

Данные загружаются из Firebase асинхронно.Это означает, что код работает не в том порядке, который вы, вероятно, ожидали.Вы можете легко увидеть это, поместив туда несколько записей:

console.log("Before starting to load value");
ref.child("path").on("value", snapshot => {
  console.log("Loaded value");
});
console.log("After starting to load value");

Когда вы запускаете этот код, он печатает:

Перед началом загрузки значения

После начала загрузки значения

Загруженное значение

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

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

function loadData() {
 return ref.child("path").once("value");
});

loadData().then((snapshot) => {
  ... use the data from snapshot
});

Обратите внимание, что асинхронная загрузка является невероятно распространенным источником путаницы для разработчиков, которыеновичок в этом.Я настоятельно рекомендую проверить некоторые другие вопросы по теме:

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