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

How to check efficiently if collection is empty?

本文关键字:是否 集合 检查 有效地      更新时间:2023-09-26

…我强调了这个词:

  1. 取整个集合并调用numChildren() is肯定。
  2. 抓取任何项目和使用exists()也出来了,因为我不知道密钥-它们是由Firebase在push()时自动生成的。

这是众所周知的"如何有效地确定集合的长度"的子问题。

所以也许会有另一种更干净的解决方案。

我的看法是:

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

问题是检测什么时候是空的。

如果没有子进程,once()返回的promise在pending状态下被挂起,而不是立即失败。

这种方法可以通过在超时后调用off()来保存,但是会出现两个问题:

  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监听器每个子进程运行一次,所以如果没有子进程,它就永远不会运行。

不要引用我的话,但我记得在某个地方读到过直接访问节点已经非常高效了(即使有大量的子节点)。

话虽这么说,也许您最好的解决方案是为子节点的数量添加一个计数器,并直接读取该值。