如果收集是空的,如何有效地检查?

时间:2016-09-18 17:48:50

标签: javascript firebase firebase-realtime-database

......我强调这个词有效:

  1. 获取整个集合并致电numChildren() 绝对是。
  2. 获取任何项目并使用exists()也是不对的,因为我不知道密钥 - 它们是push()时由Firebase自动生成的。
  3. 这是一个众所周知的子问题'如何有效地确定集合的长度'。

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

    我的意思是:

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

    问题在于检测它何时为空。

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

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

    1. 如何确定适当的超时量?
    2. 这种使用超时的解决方法令人难以置信的蹩脚

2 个答案:

答案 0 :(得分:2)

您可以尝试这种方法,但我不完全确定在后台进行的实际从服务器检索的数据量是多少。

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

此代码与您最初尝试的代码段之间的主要区别在于使用value侦听器而不是child_added侦听器。 value监听器将返回任何值,更重要的是返回null如果没有(参考不存在)。 <{1}}监听器每个孩子运行一次,所以如果没有孩子,它就永远不会运行。

答案 1 :(得分:1)

不要引用我这个,但我记得在某处直接访问节点非常有效(即使有大量的孩子)。

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