Firebase – Как получить данные из вызова .once

поэтому я пытаюсь получить данные из базы данных firebase с помощью следующего кода:

loadblah(){
  var valueArray = [];
  valueArray = firebase.database().ref("/Users/johnny/files/").once('value', function(snapshot){
      console.log(snapshot.val()); //First output
      return snapshot.val();
  });

  console.log(valueArray); //Second output
}

В любом случае, как вы можете видеть, я добавил несколько файлов console.log для отладки, и они дают совершенно разные результаты.

Первый вывод - это то, на что я надеялся, например, { fileOne: {title: blah, text: blah}, fileTwo... } и так далее. но для второго вывода я получаю это.

введите здесь описание изображения

Любая идея, как получить данные в snapshot.val()? Любая помощь будет высоко оценена, я довольно новичок в этом.

РЕДАКТИРОВАТЬ: Еще лучше, если бы вы могли каким-то образом показать мне, как использовать функцию .on для синхронизации, что было бы здорово.


person Ryan Turnbull    schedule 18.05.2017    source источник


Ответы (1)


Ваше замешательство довольно часто встречается у тех, кто впервые работает с Firebase.

Вызов Firebase once – это асинхронная операция, поэтому она будет завершена только позже, когда загрузка будет окончательно завершена – намного после возврата вашей функции loadblah(). Когда это сработает, будет вызвана предоставленная функция, и ваши данные будут готовы к использованию insnapshot.val().

И наоборот, возвращаемое значение, хранящееся в вашей переменной valueArray, представляет собой переменную firebase.Promise, которая предоставляет альтернативный способ ожидания получения такого значения.

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

person Paulo Mattos    schedule 18.05.2017
comment
О, я понял! Таким образом, функция (моментальный снимок) вызывается только после загрузки элементов. когда я помещаю console.log() внутри функции, она работает, как и ожидалось. Быстрый вопрос, как мне установить состояние в этой функции? это не позволяет мне - например (this.setState не определено) - person Ryan Turnbull; 18.05.2017
comment
@RyanTurnbull Странно... как это руководство показывает, что оттуда также можно вызвать this.setState. - person Paulo Mattos; 18.05.2017
comment
да, это говорит, что this.setState не является функцией и не определено - person Ryan Turnbull; 18.05.2017
comment
если вас интересует @PauloMattos, мне пришлось создать указатель на это, например, var that = this, и это сработало, как и ожидалось. странный. - person Ryan Turnbull; 18.05.2017