如何有效地检查集合是否为空
How to check efficiently if collection is empty?
…我强调了这个词:
- 取整个集合并调用
numChildren()
is肯定。 - 抓取任何项目和使用
exists()
也出来了,因为我不知道密钥-它们是由Firebase在push()
时自动生成的。
这是众所周知的"如何有效地确定集合的长度"的子问题。
所以也许会有另一种更干净的解决方案。
我的看法是:
collectionRef.orderByKey().limitToFirst(1)
.once('child_added').then(snap => {
alert('Not empty');
});
问题是检测什么时候是空的。
如果没有子进程,once()
返回的promise在pending状态下被挂起,而不是立即失败。
这种方法可以通过在超时后调用off()
来保存,但是会出现两个问题:
- 如何确定正确的超时时间
- 这个超时的解决方案是令人难以置信的蹩脚
您可以尝试这种方法,但是我不完全确定后台发生了什么,实际上有多少数据正在从服务器检索。
collectionRef.orderByKey().limitToFirst(1).once('value').then(snap => {
if (snap.numChildren() > 0) {
alert("not empty");
} else {
alert("empty!");
}
});
此代码与您最初尝试的代码片段之间的关键区别是使用value
侦听器而不是child_added
侦听器。value
侦听器将返回存在的任何值,更重要的是,如果没有任何值(引用不存在),则返回null
。child_added
监听器每个子进程运行一次,所以如果没有子进程,它就永远不会运行。
不要引用我的话,但我记得在某个地方读到过直接访问节点已经非常高效了(即使有大量的子节点)。
话虽这么说,也许您最好的解决方案是为子节点的数量添加一个计数器,并直接读取该值。
相关文章:
- 在 Forerunner 数据库集合中创建主键时,key 属性是否可以位于集合对象的对象内部
- 查找所选项目是否在集合中
- 查找集合中是否存在具有值的项
- 是否存在非IE等价物“;所有“;元素集合
- 使用for.of迭代时删除集合中的元素是否安全
- 流星:检查是否定义了集合
- ES6:在设置/映射迭代期间从集合/映射中删除元素是否危险
- MongoDB 的集合构造函数是否仅在集合不存在时才创建集合
- 是否可以在 Backbone.js 中延迟获取集合中的模型,同时有时获取(和发布)整个集合
- 检查元素是否在 jquery 集合中
- 检查某些内容是否是主干 js 中的模型或集合
- 在Meteor中使用#each,检查是否'最后'已到达集合中的元素
- 验证AngularJS集合是否包含项
- 是否有用于处理集合/数组的快速javascript库
- 是否可以将映射集合名称的名称作为MongoDB映射函数中键的一部分
- 正在检查集合中是否有任何脏的主干模型数据
- 检查数字是否在集合中的最快速方法
- 是否有一种方法可以获取模板数据上下文中使用的集合名称
- 是否有一种纯粹基于Promise的方法来映射/连接集合
- 检查元素是否存在于jQuery集合中