现在有几次我遇到了一个同步&使用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()是一个异步调用,所以当我们达到返回速度时,还没有设置速度.如果我们把返回值放在.on()回调函数中,那么根本没有返回任何东西.
一个解决方案是使我的calcVelocity()函数也是异步的.
另一个解决方案是存储同步读取但从Firebase异步更新的Firebase缓存版本.
解决方法
您确定了两种可能性:也可以使您的功能异步,或缓存最新的Firebase数据,以便您可以同步访问它.考虑到您正在撰写的应用程序的上下文,您使用的是只是一个偏好和方便的问题.
例如,我们已经注意到,“动作游戏”通常由严格的渲染循环驱动,而不是由firebase数据更改事件驱动.因此,缓存用于渲染循环的最新Firebase数据是有意义的.例如:
var latestSnapshot = null; firebaseRef.on('value',function(snap) { latestSnapshot = snap; });
然后,您可以在render循环(或任何其他地方)中同步使用latestSnapshot,尽管在第一个firebase回调发生之前,您需要小心处理它为null.