如何在 Firebase 9 中使用 ref.once?

发布于 2025-01-11 12:45:09 字数 900 浏览 0 评论 0原文

与以下相关的所有包含代码示例的文档 firebase.database 适用于版本 8 及更低版本。通过探索导出的模块本身,我获得了很多直觉,但我不知道如何更新像 ref.once('value') 这样的代码。

其他代码现在是这样的:

ref.update(data); // old
update(ref, data); // new

但是没有像 once(ref, data) 那样使用 once 来执行 once 。此外,创建的引用似乎缺乏任何可用的属性。

输入图片此处描述

这意味着如何针对 Firebase 进行更新9.xFirebase 9 文档似乎没有提供任何示例。

All of the docs that have code examples related to firebase.database are for version 8 and below. I've intuited a lot from exploring the exported modules themselves, but one thing I can't figure out how to update is code like ref.once('value').

Other code is now like:

ref.update(data); // old
update(ref, data); // new

But there is no once to do once to use like once(ref, data). Additionally the created refs seem to lack any property to use.

enter image description here

How is this meant to be updated for Firebase 9.x? The Firebase 9 docs don't seem to offer any example.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

腻橙味 2025-01-18 12:45:09

这里是 firebaser

once('value' 方法已被 get() 函数替换,因此:

const snapshot = await get(ref);

另请参阅有关 读取数据一次


(因此) 。不是get()) 您现在可以使用您调用的函数的返回值来订阅,

因此,如果您订阅:

const unsubscribe = onValue(ref, (snapshot) => { ... });

您可以稍后取消订阅:

unsubscribe();

这是 Firestore SDK 已经执行的操作和反馈。表明开发人员更喜欢关闭而不是关闭。

firebaser here

The once('value' method has been replace by a get() function, so:

const snapshot = await get(ref);

Also see the Firebase documentation on reading data once.


To unsubscribe from a realtime listener (so not get()) you now can use the return value from the function you called to subscribe.

So if you subscribe with:

const unsubscribe = onValue(ref, (snapshot) => { ... });

You can then later unsubscribe with:

unsubscribe();

This is what the Firestore SDKs already did, and feedback indicated that devs preferred that over off.

时光礼记 2025-01-18 12:45:09

注意(~2022 年 6 月 24 日;firebase v9):get()推荐 一次读取数据的方式(参见Frank 的帖子),目前 get() 存在一些未解决的问题,其中客户端执行 同一引用路径上具有不同过滤器的多个查询会以某种方式导致查询之间的干扰,从而导致意外触发事件(请参阅下面的链接)。我也经历过这个,调试起来相当困难。这可能是由 get() 的缓存机制引起的,如下问题所示:

解决方法:除了通过 get() 检索结果之外,您还可以使用 onValue()(请参阅价值观察者),然后在项目完成后立即断开连接返回:

const val = await new Promise((resolve, reject) => {
  onValue(query, (snap) => resolve(snap.val()), { onlyOnce: true });
});

免责声明:请注意,onValue()onlyOnce: true 结合使用将立即从 Firebase 的本地磁盘缓存返回值(如果存在) ,而不是检查首先更新服务器上的值(就像 get() 的情况一样)。

2022年8月27日更新:
firebase-js-sdk 团队似乎最近解决了这个问题 和 Firebase v9.9.3 get() 现在可以按预期工作。

Heads up (~24 Jun 2022; firebase v9): While get() is the recommended way to read data once (see Frank's post), there are currently some unresolved issues with get() where a client's execution of multiple queries with different filters on the same ref path somehow causes interference between the queries resulting in the unexpected triggering of events (see links below). I also experienced this and it's quite hard to debug. It is probably caused by get()'s caching mechanism as hinted at by the issues below:

Workaround: Instead of retrieving results via get(), you can also use onValue() (see value observer) and then disconnect it immediately after the item has been returned:

const val = await new Promise((resolve, reject) => {
  onValue(query, (snap) => resolve(snap.val()), { onlyOnce: true });
});

Disclaimer: Note that onValue() in combination with onlyOnce: true will return values from firebase's local disk cache immediately (if present), instead of checking for an updated value on the server first (as it is the case with get()).

Update from 2022-08-27:
It seems the firebase-js-sdk team solved this recently and with with Firebase v9.9.3 get() is working as expected now.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文