Я пытаюсь получить данные из firebase и его в формате этого:не может извлекать данные из firebase
>Users
--->UID
------>email:
------>height:
------>etc...
По какой-то причине UID продолжает возвращаться неопределенными, когда я пытаюсь получить значение скажите электронную почту. Это код, который пытается получить данные:
.factory('Chats', function($rootScope) {
// Might use a resource here that returns a JSON array
var chats;
return {
all: function() {
return chats;
},
initialize: function(isLoggedIn) {
var data = $rootScope.ref.getAuth().uid;
console.log("initialize: " + data);
if(isLoggedIn == true) {
$rootScope.ref.on("value", function(snapshot) {
console.log("Value: " + snapshot.val());
console.log("Users: " + snapshot.val().users);
console.log("Data: " + snapshot.val().users.data.email);
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
}
}
};
})
Он ломает, когда он получает третий console.log («данные» один), он генерирует исключение, говоря:
Cannot read property 'email' of undefined
Но когда я регистрирую переменную data1 непосредственно перед оператором if, он возвращает правильный UID пользователя в виде строки, поэтому я не понимаю, почему он говорит мне, что он не определен. Все, что я пытаюсь сделать, это выкапывать дерево firebase и извлекать значения пользователей (по электронной почте, высоте и т. Д.) На основе UID пользователя, которые я получаю, вызывая ref.getAuth(). Uid.
Спасибо, продвинутый!
Эй, Фрэнк, спасибо за ваш ответ - это сработало! Быстрый вопрос, хотя есть ли способ в Angular ждать Firebase для извлечения данных, прежде чем перейти к следующей строке кода? Код находится в моем service.js и возвращает объект с информацией о пользователях - мой контроллер вызывает службу. Мой контроллер затем устанавливает возвращаемое значение службы в переменную, но похоже, что контроллер не дожидается возврата службы, поэтому он устанавливает неопределенную переменную. – MatTaNg
Там (к счастью) нет способа заставить код ждать данных, которые асинхронно загружаются в браузере. Прочитайте последние две ссылки в моем ответе о способах решения этой проблемы. –
Изучите функции async, используя синтаксис async/wait. Это на этапе 3 процесса стандартизации ECMAScript. Это позволяет вам писать код, как если бы он был синхронным, оставаясь асинхронным, поэтому @MatTaNg, вы можете позвонить в Firebase, и ваш код будет «ждать» перед выполнением следующей строки, хотя под капотом это фактически ничего не блокирует. – lastmjs