小编典典

处理函数中的异步调用(Firebase)

ajax

现在,我有几次遇到使用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同步读取但异步更新。

这些解决方案中的一种优于另一种吗?有更好的解决方案吗?


阅读 408

收藏
2020-07-26

共1个答案

小编典典

您确定了两种可能性:要么使函数也异步,要么缓存最新的Firebase数据,以便您可以同步访问它。鉴于您正在编写的应用程序的上下文,您使用哪一个只是偏好和便利性的问题。

例如,我们注意到“动作游戏”通常是由紧密的渲染循环驱动的,而不是由Firebase数据更改事件驱动的。因此,缓存最新的Firebase数据以在渲染循环中使用是有意义的。例如:

var latestSnapshot = null;
firebaseRef.on('value', function(snap) { latestSnapshot = snap; });

然后,您可以在渲染循环(或其他任何地方)中同步使用latestSnapshot,尽管在第一个firebase回调发生之前,您必须小心将其处理为null。

2020-07-26