gpt4 book ai didi

firebase - 正确使用 Firebase 中的引用文献中的 hasChild() 和 forEach() 吗?

转载 作者:行者123 更新时间:2023-12-03 00:46:14 24 4
gpt4 key购买 nike

由于我的理解和 SQL 背景有限,我不太了解 hasChild() 和 forEach() 的用法;他们感觉自己属于引用而不是快照。

(我将在其余讨论中使用 hasChild(),但这些概念是可以互换的。)

这是我的推理:

  1. 我有一个为用户表调用的 Firebase 路径,例如 appname/users
  2. 我想查看用户 (Fred) 是否存在
  3. 我获得了一个引用:var users = new Firebase('appname/users')

但我无法确定这里是否存在 child 。这就是我现在所拥有的:

users.child('Fred').once('value', function(snapshot) {
/** waits around forever if Fred doesn't exist */
});

但这并不完全有效。所以现在我必须通过这样的方法来获取用户的值(value)(这感觉有点违反直觉,因为我对用户不感兴趣):

var users = new Firebase('http://.../appname/users');
users.once('value', function(snapshot) {
snapshot.childExists('Fred', function(exists) {
/* do something here*/
});
});

根据文档,我不认为通过获取 appname/users 会产生很大的开销,但如果我只想确定键是否为 '弗雷德存在。

我希望看到类似的内容:

var users = new Firebase('http://.../appname/users');
users.hasChild('Fred', function(exists[, snapshotOfFred]) {
/* do something here*/
});

是否有更好的方法来使用 forEach/hasChild?我在这里错过了任何重要的逻辑考虑吗?

最佳答案

您的第一个代码片段实际上走在正确的轨道上。 .once() 将通过快照触发您的回调,无论 Fred 是否已经存在。所以你可以这样做:

users.child('Fred').once('value', function(snapshot) {
if (snapshot.val() === null) {
/* There is no user 'Fred'! */
} else {
/* User 'Fred' exists.
}
});

您的第二个代码段实际上会产生很大的开销,因为 Firebase 会从 Firebase 获取整个“用户”位置,如果您有 1000 个用户,这可能会非常大!所以第一个代码片段绝对是正确的选择。

hasChild 和 forEach 位于 DataSnapshot 上而不是 Firebase 上的原因是它们可以同步。在我们早期的 API 测试中,我们在 Firebase 引用中混合使用了同步和异步方法,但我们发现这对人们来说是一个重要的绊脚石(如果人们看到 hasChild 方法,他们会期望它返回一个 bool 值)立即地)。因此,我们创建了 .on() 和 .once() 作为 Firebase 上唯一的异步回调方法。 Firebase 引用上的所有其他内容都是同步的(尽管我们有时提供可选的异步完成回调),并且 DataSnapshot 上的所有内容都是 100% 同步。

因此,我们的目标是让 Firebase 的异步特性更易于人们理解和使用!但也许我们还没有100%成功。 :-) 在规划 future 的 API 调整时,我们会考虑您的反馈。谢谢!

关于firebase - 正确使用 Firebase 中的引用文献中的 hasChild() 和 forEach() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11420650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com