Обработка асинхронных вызовов (Firebase )в функциях

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

function calcVelocity() {
    var distance, time, velocity;

    firebaseRef.once('value', function(snapshot) {
        distance = snapshot.val().distance;
        time = snapshot.val().time;

        velocity = distance / time;
    });
    return velocity;
}

$("#velocity").html(calcVelocity());

. Конечно, приведенный выше код не будет работать, потому что firebaseRef.once()— это асинхронный вызов, поэтому velocityеще не был установлен, когда мы достигаем return velocity;. Если мы поместим returnвнутри функции обратного вызова .on(), то вообще ничего не будет возвращено.

Одним из решений было бы сделать мою функцию calcVelocity()асинхронной.

Другим решением было бы хранить кешированную версию Firebase, которая читается синхронно, но обновляется асинхронно из Firebase.

Является ли одно из этих решений лучше другого? И есть ли лучшее решение?

10
задан Matt Robertson 24 July 2012 в 18:06
поделиться