微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

onSnapshot 在超过 firebase 限制时不起作用

如何解决onSnapshot 在超过 firebase 限制时不起作用

我试图限制在我的网络应用程序中显示的消息数量,当我尝试使用 limitorderBy 时,它在超过其限制(即 15)后停止显示新消息,所以我在哪里做错了吗?

PS:我试过 orderBy("createdAt","desc") ,它显示新消息,但按降序排列

代码

useEffect(() => {
    const unsub = db
      .collection("messages")
      .orderBy("createdAt")
      .limit(15)
      .onSnapshot((snapshot) => {
        setMessages(
          snapshot.docs.map((doc) => ({ id: doc.id,msg: doc.data() }))
        );
      });
    return unsub;
  },[]);

解决方法

当使用仅附加列表时,您可以限制最初返回的值的数量,但仍然可以通过使用 limitToLast() 获得未来的添加:

db.collection("...")
  .orderBy("timestamp")
  .limitToLast(3)
  .onSnapshot(change => console.log(change.type,change.doc.id));

Here's a working example

,

您正在为仅这 15 个文档的更改建立侦听器 - 您已经限制了要监视的文档。查询正在做它应该做的事情。听起来这不是您真正想要的。

您可以只对 15 个文档进行提取 (.get()),然后根据您想要的任何事件(点击等)使用 .startAfter().get() 获取下一组。

如果(如果)您需要监视文档子集的更改,那么您需要在第一组文档上移除侦听器,并在下一组文档上创建一个新的侦听器。>

记住:onSnapShot() 是一个监听器,监听变化。如果这不是真正的要求,只需使用 .get()

,

如果您想显示 15 条最新消息,这意味着您需要按降序创建进行订购:

db
  .collection("messages")
  .orderBy("createdAt","desc")
  ...

如果您仍想在底部显示最新消息,则必须在应用程序代码中反转消息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?