如何有效地检查收集是否为空?

如何有效地检查收集是否为空?

问题描述:

...我强调有效这个词:如何有效地检查收集是否为空?

  1. 抓取整个集合,并呼吁numChildren()是 肯定的。
  2. 抓取任何物品并使用exists()也出来了,因为我不知道密钥 - 它们是由Firebase自动生成的,当时push() ing。

这是一个众所周知的“如何确定有效集合的长度”的子问题。

所以也许会有另一个更清洁的解决方案。

我的看法是:当它是空

collectionRef.orderByKey().limitToFirst(1) 
    .once('child_added').then(snap => { 
    alert('Not empty'); 
    }); 

问题是检测。

once()返回的承诺暂停处于暂挂状态,而不是立即失败,如果没有子女。

这种办法可以通过调用某些超时后off()被保存,但2个问题就出来了:

  1. 如何判断超时适量?
  2. 此解决办法超时是令人难以置信的跛脚

不要引用我,但我记得读书的地方,直接访问节点是非常有效的已经(即使有大量儿童)。

这就是说,也许你最好的解决方案是为孩子的数量添加一个计数器并直接读取该值。

你可以尝试这种方法,但是我不完全确定在背景中发生了什么,就服务器实际检索到多少数据而言。

collectionRef.orderByKey().limitToFirst(1).once('value').then(snap => { 
    if (snap.numChildren() > 0) { 
     alert("not empty"); 
    } else { 
     alert("empty!"); 
    } 
}); 

此代码,您正在使用value听众,而不是child_added听者最初试图片断之间的关键区别。如果没有任何内容(引用不存在),value侦听器将返回任何值,更重要的是返回nullchild_added监听器为每个孩子运行一次,所以如果没有孩子,它永远不会运行。

+0

我不确定如何使用规则的方法可行,但您的其他方法听起来不错。 –

+0

在'value'和'child_added'监听器之间增加了一个说明,解释了为什么@ FrankvanPufelen的原始代码无法工作。 –

+0

是的,我忘了你不能在第三秒在Firebase中有一个空阵列 – Callam