Возврат undefined объекта из моментального снимка firebase

59
7

Я реализовал функцию, в которой я хочу вернуть объект, сохраненный под определенным URL-адресом. В приведенном ниже коде первый "console.log(result);" возвращает правильный объект из местоположения firebase. Второй возврат не определен. Может кто-нибудь объяснить, почему и как это исправить?

    _getById: function(obj) {
var url = "https://my-app.firebaseio.com/list/" + obj.groupId;
console.log(url);
var ref = new Firebase(url);
var result = {};
ref.on("value", function(snapshot) {
result = snapshot.val(); //first
console.log(result);
}, function (errorObject) {
}
);
console.log(result); //second
return result;
},

спросил(а) 2015-08-11T21:18:00+03:00 5 лет, 3 месяца назад
1
Решение
72

Данные загружаются из Firebase асинхронно. Итак, вы заметите, что ваш второй console.log() отображается перед первым. Вы не можете возвращать данные, которые загружаются асинхронно.

Вам придется изменить способ кодирования. Вместо того, чтобы "получить идентификатор, а затем сделать что-то с ним", вам нужно "делать что-либо всякий раз, когда id загружается/изменен".

Поэтому вместо:

 var list = _getById({ groupId: 42});
console.log("Our list is: "+list);

Вы будете:

 _getById({ groupId: 42 }, function(list) {
console.log("Our list is: "+list);
});
_getById: function(obj, callback) {
var url = "https://my-app.firebaseio.com/list/" + obj.groupId;
console.log(url);
var ref = new Firebase(url);
var result = {};
ref.on("value", function(snapshot) {
result = snapshot.val(); //first
callback(result);
}, function (errorObject) {
});
console.log(result); //second
return result;
},

В приведенном выше коде мы передаем обратный вызов в _getById() и вызываем этот обратный вызов, когда список загружен (и всякий раз, когда список изменяется).

Некоторые дополнительные материалы для чтения:

ответил(а) 2015-08-11T22:12:00+03:00 5 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема