Firebase中的记录总数(我什么时候计算?)

时间:2012-07-23 18:10:00

标签: firebase

计算表中的记录显然是一种手动操作,直到你们已经在工作中获得了一些漂亮的新功能;)

但是,我甚至坚持使用.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?

我预见到任何类型的分页都存在同样的问题,我觉得我对此有点扼杀。我错过了什么?

这基本上是错误的模式,例如,获取用户在其队列中的消息数量吗?

3 个答案:

答案 0 :(得分:6)

使用“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.
});

答案 1 :(得分:6)

child_added事件没有“完成”的概念,因为随着时间的推移,孩子可以继续添加。如果您想立即计算的孩子,您可以使用'value'从该位置获取当前快照,然后计算子项。例如:

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。

答案 2 :(得分:0)

在FB实现count作为返回函数之前,我想没有客户端循环通过任何返回记录的最佳方法是以REST方式获取它。

参考:What’s the best RESTful method to return total number of items in an object?