Лучший способ получить данные Firebase и вернуть их или альтернативный способ

Я использую Firebase для некоторых проектов, и мне очень нравится эта платформа.

Я просто наткнулся на вещь, которую я не мог сделать, и мне было интересно, есть ли способ достичь этого или есть ли альтернативный способ сделать это.

Что я пытаюсь сделать, так это создать функцию для извлечения последних X записей из моей базы данных Firebase и возврата данных в вызывающую функцию.

Что-то вроде этого:

function getTwoLatestLocations()
{
    var twoLocations;
    myFirebaseRef.limitToLast(2).once('value', function (dataSnapshot) {
        twoLocations = dataSnapshot.val();
    }, function (errorObject) {
        // code to handle read error
        console.log("The read failed: " + errorObject.code);
    });

    return twoLocations;
}

И затем вызывая это так:

function someCalcutationsWithTheTwoLastLocations()
{
    var twoLastLocations = getTwoLatestLocations();
    // Do some calculations
}

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

Есть ли способ сделать это элегантно, чтобы я мог разделить методы?

P.S. В настоящее время весь мой код находится просто внутри вызова базы данных. Уродливый.


person Sigmundur    schedule 20.01.2016    source источник


Ответы (1)


Чтобы отделить код, вы должны передать обратный вызов:

function getTwoLatestLocations(callback)
{
    var twoLocations;
    myFirebaseRef.limitToLast(2).once('value', function (dataSnapshot) {
        twoLocations = dataSnapshot.val();
        callback(twoLocations);
    }, function (errorObject) {
        // code to handle read error
        console.log("The read failed: " + errorObject.code);
    });

}

И затем вызывая это так:

function someCalcutationsWithTheTwoLastLocations()
{
    getTwoLatestLocations(function(twoLocations) {
        // Do some calculations
    });
}

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

Это обсуждалось довольно много раз, в том числе в этом верхнем ответе из списка связанных вопросов: Обработка асинхронных вызовов (Firebase) в функциях

person Frank van Puffelen    schedule 20.01.2016
comment
да. Это один из двух вариантов. Я выбрал другой вариант. Чтобы кэшировать мой снимок каждый раз, когда вызывается метод on. Я думаю, это просто вопрос предпочтений. Я отмечу это как правильный ответ, поскольку вы упомянули одну возможность и предоставили ссылку, которая включает другую. Я бы сам ответил на это, если бы никто не ответил сейчас. Спасибо. - person Sigmundur; 21.01.2016
comment
Если мой ответ был полезен, проголосуйте за него. Если мой ответ предоставил вам решение, с которым вы согласились, примите его. Если вы выбрали другое решение, ответьте себе и примите его. Это вполне приемлемо здесь, в StackOverflow. - person Frank van Puffelen; 21.01.2016