当前位置: 首页 > 面试题库 >

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

顾昌翰
2023-03-14
问题内容

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

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


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 我对Node.js并不陌生,尽管我通常对JavaScript非常熟悉。我的问题是关于如何处理node.js中的错误的“最佳实践”。 通常,在对Web服务器,FastCGI服务器或各种语言的网页进行编程时,我在多线程环境中使用带有阻止处理程序的Exceptions。当有请求进入时,我通常会执行以下操作: 这样,我始终可以处理内部错误并向用户发送有效响应。 我知道使用node.js可以执行

  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调

  • 问题内容: 我有一个异步函数,要连续多次调用。问题是“多个”可以是几十万或数百万… 显而易见的方法是从回调中调用相同的函数,如下所示: 当然,涉及一些逻辑来停止递归。问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 问题答案: 问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 否。 如果调用回调是异步传递的,则不会堆积堆栈。 在您的代码中: 这是逐步发生的事情: 首先被称为。 然后

  • 当导航到带有防护装置的页面时,已或都会打印到控制台(在等待 firebase 响应的一段时间后)。但是,导航永远不会完成。另外,如果我没有登录,我会被重定向到路由。因此,我遇到的问题是 不会向用户显示请求的页面。我假设这是因为我正在使用回调,但我无法弄清楚如何做到这一点。有什么想法吗?

  • 考虑以下几点: 每秒最多可有100个并发请求的web应用程序 当前每个传入请求都向endpoint发出http请求以获取某些数据(最多需要5秒) 我只想发出一次http请求,也就是说,我不想对同一个endpoint进行并发调用,因为它将返回相同的数据 这个想法是,只有第一个请求才会进行http调用以获取数据 而此呼叫是“飞行”,随后的请求将不会发出相同的呼叫,而是“等待”第一个飞行请求完成。 当对

  • 请考虑以下类: 现在,应该启动执行的线程,因此它的实现方式如下: 这在g++-4.6.3中是完美无缺的,但在g++-4.5.2中就不行了,错误消息是 include/C++/4.5.2/Functional:180:9:error:必须使用“.”或“->”调用std::declval with_tp=void(foo::*)(长无符号int),typename std::add_rvalue_re