【问题标题】:Firebase .get() vs .once() - What is the difference?Firebase .get() 与 .once() - 有什么区别?
【发布时间】:2021-03-13 00:03:32
【问题描述】:

文档here 但我不明白: .get() 和 .once() 有什么区别?

我的理解是.get()从服务器读取,然后从本地存储读取,.once()只从本地存储读取。我已经使用.once() 来检索值而没有设置像.on() 这样的侦听器,它似乎正在从服务器(实时数据库)中检索我以前没有检索过的值,所以我不确定它是什么意思说它只搜索本地存储...看起来它实际上是从服务器获取值。

请说明何时使用一种与另一种。

我根本没用过.get()

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    firebaser 在这里

    实际上,在 Web SDK 中,get()once('value' 之间没有实际区别,因为 Web SDK for Realtime Database。不支持磁盘持久化。

    我们主要决定将 get() 方法添加到 JavaScript SDK,因为我们正在向 iOS 和 Android SDK 添加类似的方法,在这些方法之间存在真实但微妙的差异。有关详细说明,请参阅What is the difference between get() and addListenerForSingleValueEvent?addListenerForSingleValueEvent 是 JavaScript 的 once() 调用的 Android 变体)。

    【讨论】:

    • 谢谢弗兰克 :) Ganbayar 的回应听起来是有区别的:如果您已经以某种方式在缓存中获得了最新的响应,那么使用.once() 会更具成本效益。虽然没有设置监听器,但当我运行.once() 时,它如何知道它是否在缓存中有最新的数据?你能澄清一下吗?
    • 我与工程师一起定义了这个 API,所以我非常清楚这个 API 如何在所有平台上工作。 ? JavaScript SDK 没有磁盘缓存,因此拥有该值的唯一方法是将其保存在内存中,这意味着您需要有一个活动的on() 侦听器,这也解释了为什么@987654330 @ 和 get() 将返回内存中的值。在这种情况下,如果它们中的任何一个做了不同的事情或从网络中检索值,那么这就是实现中的错误。例如:Android 实现中曾短暂存在过此类错误,但已修复。
    • 注意:我应该说“我非常清楚这个 API 如何应该在所有平台上工作”,因为当然总是可能出现错误。 ?
    【解决方案2】:

    .get() 将始终尝试调用数据库,如果仅当无法访问数据库或类似情况时,它会回退到本地缓存。

    另一方面; .once() 将始终尝试从本地缓存中获取值,而不是调用数据库,使其具有成本效益。

    你也可以看看reference上的方法更清楚:

    .get() 
    Gets the most up-to-date result for this query.
    
    Returns Promise<DataSnapshot>
    A promise which resolves to the resulting DataSnapshot if a value is available, 
    or rejects if the client is unable to return a value 
    (e.g., if the server is unreachable and there is nothing cached).
    
    .once()
    Listens for exactly one event of the specified event type, 
    and then stops listening.
    
    This is equivalent to calling on(), and then calling off() inside 
    the callback function.
    

    我希望这可以澄清。

    【讨论】:

    • Ganbayar 的好答案!
    • 谢谢!参考非常有帮助。我还在学习如何使用文档 XD
    • @Ganbayar .once() 的引用并没有用一个词提到本地缓存,您的回复基于哪一部分?
    【解决方案3】:

    下面Frank 的回答没有技术差异,但在实践中,我在 Firebase Functions 中使用 .get() 时似乎无缘无故收到大量“客户端离线”错误。

    我推荐使用.once()

    请参阅此处的问题以供参考:https://groups.google.com/g/firebase-talk/c/VpQms_TnBOw?pli=1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2013-10-31
      • 2021-05-10
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多