现在,我有几次遇到使用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()回调函数中,则什么也不会返回。
firebaseRef.once()
velocity
return velocity;
return
.on()
一种解决方案是使我的calcVelocity()函数也异步。
calcVelocity()
另一种解决方案是存储Firebase的缓存版本,该版本可以从Firebase同步读取但异步更新。
这些解决方案中的一种优于另一种吗?有更好的解决方案吗?
您确定了两种可能性:要么使函数也异步,要么缓存最新的Firebase数据,以便您可以同步访问它。鉴于您正在编写的应用程序的上下文,您使用哪一个只是偏好和便利性的问题。
例如,我们注意到“动作游戏”通常是由紧密的渲染循环驱动的,而不是由Firebase数据更改事件驱动的。因此,缓存最新的Firebase数据以在渲染循环中使用是有意义的。例如:
var latestSnapshot = null; firebaseRef.on('value', function(snap) { latestSnapshot = snap; });
然后,您可以在渲染循环(或其他任何地方)中同步使用latestSnapshot,尽管在第一个firebase回调发生之前,您必须小心将其处理为null。