Несколько раз я столкнулся с проблемой синхронных и асинхронных функций с использованием 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.
Является ли одно из этих решений лучше, чем другое? И есть ли лучшее решение?