从Firebase中的引用正确使用hasChild()和forEach()?

Kat*_*ato 8 firebase

由于我的理解和SQL背景有限,我不太了解hasChild()和forEach()的用法; 他们觉得他们属于参考而不是快照.

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

这是我的推理:

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

但我无法确定这里是否有孩子存在.所以这就是我现在拥有的:

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

但这并不是很有效.所以现在我必须得到这样的东西的用户的价值(这感觉有点反直觉,因为我对用户不感兴趣):

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

我不认为appname/users基于文档提取会产生很大的开销,但如果我只是想确定密钥'Fred'是否存在,这就像是一个难看的代码.

我希望看到类似的东西:

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

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

Mic*_*uer 12

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

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

你的第二个代码片段实际招致大的开销,因为火力地堡将获取从火力地堡整个"用户"的位置,这可能是相当大的,如果你有用户的1000!因此,第一个代码片段绝对是最佳选择.

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

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