【发布时间】:2019-03-13 10:46:03
【问题描述】:
infiniteHandler($state) {
var next = db
.collection("posts")
.orderBy("timestamp", "desc")
.startAfter(this.lastVisible)
.limit(3)
next.get().then(documentSnapshots => {
//Get the last visible document
// this.lastVisible =
// documentSnapshots.docs[documentSnapshots.docs.length - 1]
if (documentSnapshots.docs.length == 0) $state.complete()
else {
this.$store.commit(
"modules/posts/updateLastVisible",
documentSnapshots.docs[documentSnapshots.docs.length - 1].data()
.timestamp
)
}
documentSnapshots.forEach(doc => {
var post = doc.data()
post.docID = doc.id
this.$store.commit("modules/posts/pushPost", post)
})
$state.loaded()
})
}
这是我的无限加载处理程序,一旦到达列表末尾,它就会获取新的数据库条目。到目前为止工作正常。
这是我在页面加载时的第一次抓取
async fetch({ store }){
if (store.state.modules.posts.posts.length < 5) {
let posts = []
await db
.collection("posts")
.orderBy("timestamp", "desc")
.limit(3)
.get()
.then(querySnapshot => {
store.commit(
"modules/posts/updateLastVisible",
querySnapshot.docs[2].data().timestamp
)
querySnapshot.forEach(doc => {
var x = doc.data()
x.docID = doc.id
posts.push(x)
})
})
store.commit("modules/posts/fetchedPosts", posts)
}
}
基本上,问题是当我在无限加载处理程序中获取时,我在页面加载时再次获取前 3 个条目,这导致条目显示两次,这不应该发生,因为 this.lastVisible 有我在加载时获取的第三个元素的时间戳,所以应该忽略这些。
在这些元素之后,.startAfter 一切正常,但前 3 个再次加载没有意义。
我用 devtools 检查了商店,一切正常,this.lastVisible 在第一次调用无限加载处理程序时具有正确的值。
赏金编辑: 好的,所以我仍然有这个问题,我尝试更多地解决它以找到问题,但它仍然在发生......我现在将设置一个赏金,我希望任何人都能够提供帮助。
【问题讨论】:
-
我感觉这与在 this.lastVisible 设置之前运行的infiniteHandler() 有关。尝试在函数顶部记录 lastVisible。
-
@SeanRussell 抱歉,回复晚了,是的,它确实第一次记录了一个无效的对象,这导致它基本上从整个列表的入口点开始,但我怎么能改变这种行为?
-
在 infaniteHandler() 中进行初始调用,它似乎在您第一次异步 fetch() 后工作
-
@SeanRussell 但在提取完成之前无限处理程序不应该能够工作吗?
-
我的意思是调整您的逻辑/代码以在一个功能中执行操作。你说除了前三个文件被复制之外它还有效。好吧,废弃调用前三个文档的函数。
标签: javascript firebase vue.js google-cloud-firestore nuxt.js