Firebase 中的记录总数(我啥时候完成计数?)
Posted
技术标签:
【中文标题】Firebase 中的记录总数(我啥时候完成计数?)【英文标题】:Total number of records in Firebase (when am I done counting?)Firebase 中的记录总数(我什么时候完成计数?) 【发布时间】:2012-07-23 18:10:00 【问题描述】:在表格中计算记录显然是一项手动工作,直到你们获得一些已经在工作中的漂亮新功能;)
但是,即使使用 .on('value', ...) 手动运行来获取计数,我也会坚持下去:
var table = new Firebase('http://beta.firebase.com/user/tablename');
var count = 0;
table.on('child_added', function(snapshot)
count++;
// how do I know if this is the last child? i.e. the count is complete?
);
// when is it okay to use count?
我预见到任何类型的分页都会出现同样的问题,但我觉得我对此有点呆滞。我错过了什么?
对于获取用户队列中的消息数量来说,这从根本上说是错误的模式吗?
【问题讨论】:
试试这个使用javascript对象计数,它工作。 ***.com/questions/5223/length-of-a-javascript-object 【参考方案1】:child_added 事件没有“完成”的概念,因为随着时间的推移可以继续添加孩子。如果您想现在获取孩子的计数,可以使用“值”从该位置获取当前快照,然后计算孩子的数量。例如:
table.once('value', function(snapshot)
var count = 0;
snapshot.forEach(function(childSnapshot)
count++;
);
// do something with count.
);
或者,如果您希望计数不断更新,您可以使用 .on() 而不是上面的 .once()。但这在性能方面并不理想,因为您每次都要数所有的孩子。幸运的是,您可以结合使用 'child_added' 和 'value' 来有效地保持计数:
var count = 0;
table.on('child_added', function(snapshot)
count++;
// how do I know if this is the last child? i.e. the count is complete?
);
table.on('value', function(snapshot)
// do something with count.
);
这是有效的,因为“值”将在“初始”数据完成后触发一次,然后在数据更改时再次触发,因此您将获得不断更新的正确计数。虽然如果您希望孩子被移除,您也需要处理 child_removed。
【讨论】:
对,由于某种原因,在我们讨论了在父表上调用value
所涉及的开销之后,我忘记了获取快照和使用 forEach。我的大脑听到了什么:“从内存中删除 value/forEach”:(看到了吗?我知道这很明显。
哈哈。好吧,很高兴现在有意义。 :-)【参考方案2】:
使用“child_added”无法知道您何时收到“最后一个”项目。如果您要计算在特定时间点存在的所有孩子,我建议使用“值”事件,如下所示:
var table = new Firebase('http://beta.firebase.com/user/tablename');
table.on('value', function(snapshot)
var count = 0;
snapshot.forEach(function()
count++;
);
//count is now safe to use.
);
【讨论】:
是的,被愚弄了。我使用forEach
打折了,因为它需要在父级上调用value
,这在大桌子上可能是一个很大的开销。在某个地方,我完全滑倒了。 :)【参考方案3】:
在 FB 实现 count 作为返回函数之前,我想不让客户端循环遍历任何返回记录的最佳方法是通过 REST 方式获取它。
参考:What’s the best RESTful method to return total number of items in an object?
【讨论】:
以上是关于Firebase 中的记录总数(我啥时候完成计数?)的主要内容,如果未能解决你的问题,请参考以下文章