如何只检索新数据?

inl*_*ger 22 firebase

我正在尝试为我的网站管理员创建简单的通知系统,我只需要向每个管理员用户发送实时消息.但是当我使用firebase时,它会在每个页面上加载旧数据,并且用户可以看到来自数据库的所有消息.如果我设置limit(1),用户将在每个页面重新加载时看到最后一个通知:

var eventsList = new Firebase('https://*****-messages.firebaseio.com/');

eventsList.on('child_added', function(message) {
    var message = message.val();
    $.notification(message.message);
});
Run Code Online (Sandbox Code Playgroud)

如何在没有旧通知历史的情况下仅加载新邮件?

Ana*_*ant 37

这是设计的,在实时系统中没有"最新"数据的概念,因为它总是在变化.但是,如果您只想在页面加载显示添加到列表中的项目,则可以执行以下操作:

var newItems = false;
var eventsList = new Firebase('https://*****-messages.firebaseio.com/');

eventsList.on('child_added', function(message) {
  if (!newItems) return;
  var message = message.val();
  $.notification(message.message);
});
eventsList.once('value', function(messages) {
  newItems = true;
});
Run Code Online (Sandbox Code Playgroud)

  • 如果现有列表很大,该怎么办?将为每个人调用添加的子回调.这可能会导致以下问题:1.它可能使我的UI线程忙于处理所有回调2.下载数据时不必要的带宽消耗3.在片状连接上,初始化过程可能需要很长时间4.如果我有另一个firebase引用监视更改到其他一些分支,它将不会收到回调,直到子进程为此ref添加操作...我是否正确? (11认同)
  • 你能否澄清为什么`一次'在'开启'后开火?从阅读它,因为它们都是异步的,这似乎只是一种竞争条件. (4认同)
  • "if(!newItems)return"; 检查应该在开头是正确的,所以所有的初始数据都将被忽略,并且应该非常快.如果您实际上不想下载数据,最好使用限制/查询来将数据量限制为您想要的数据量. (2认同)

小智 6

我会评论上面的内容,但由于声誉我不能,所以希望这是足够的,这是为了解决Gruff McGruff的最后评论.

一旦发生火灾,因为你想要摆脱抓住所有儿童物品的循环.一旦该循环被破坏,您将newItems变量设置为true,然后它将能够获得所有新的子项.

如果您之前解雇了它,它将失败目的并获取所有子项,无论您是否立即设置newItems变量.

此外,我使用了这种方法,效果很好.