【发布时间】:2020-03-14 10:47:16
【问题描述】:
我正在尝试使用 Firestore 创建一个类似聊天的应用程序,并尝试列出聊天中的所有消息,并在每次添加消息时更新它。
我首先尝试了这种方式来实现它。
mounted() {
docRef.collection('messages').orderBy('timestamp', 'desc').limit(1).onSnapshot((querySnapShot) => {
querySnapShot.forEach((doc) => {
if (!doc.metadata.hasPendingWrites) {
this.messages.push(doc.data())
}
})
})
}
这种方式似乎很有效,因为这种方式只能获取集合中的最新消息。但是,我发现这种方式有问题。当用户刷新页面时,用户无法获取过去的消息。
所以我就这样改了。
mounted() {
docRef.collection('messages').orderBy('timestamp', 'asc').onSnapshot((querySnapShot) => {
querySnapShot.docChanges().forEach((change) => {
if (change.type === 'added') {
this.messages.push(change.doc.data())
}
})
})
}
这种方式按我的预期工作。但是这种方式需要很多请求,因为每次更改集合时我都需要读取集合中的所有文档。
在聊天中列出消息的有效方法是什么?
我认为如果我首先获取所有当前消息并设置新消息的侦听器,但即使集合中没有变化并阅读最新消息两次,在我进入页面后立即触发侦听器。
【问题讨论】:
-
好问题...对“hasPendingWrites”一无所知,很困惑为什么它会打印多次并说我的新消息已“修改”
标签: javascript firebase vue.js google-cloud-firestore