【发布时间】:2020-01-27 01:32:08
【问题描述】:
我首先要说我几乎没有构建异步函数的经验,在阅读了关于它的文档之后,我更加困惑。
我使用 vue.js 作为框架,我的方法调用 firebase。
目标
问题在于,使用 firebase 删除文档时,它不会自动删除所有嵌套文档,您必须使用递归函数手动执行此操作。所以我不得不重新创建删除函数来完成这个,并通过制作一个 mixin 来做到这一点。 mixin 现在可以工作了,但是,reload emit 事件现在会在 delete 函数完成之前触发,因此会在 DOM 中保留一个 ghost 元素。
我希望在 deleteProject() 中对 firebase 的所有调用都完成之前,$emit('reload') 不会触发。
我的代码
<script>
import { deleteProject } from '../../../mixins/deleteData'
export default {
mixins: [deleteProject],
props: ['yearId', 'projectId', 'project'],
name: 'deleteProjectModal',
data: () => ({
dialog: false
}),
methods: {
del () {
// call deleteYear method from mixin
this.deleteProject(this.yearId, this.projectId)
// emit reload signal for database relaod
this.$emit('reload')
// close modal
this.dialog = false
}
}
}
</script>
import firebase from '@/firebase/init'
export const deleteProject = {
methods: {
deleteProject (yearId, projectId) {
// delete project, all documents in the images subcollection of the project, and all stored images
firebase.firestore().collection('years').doc(yearId).collection('projects').doc(projectId).get()
.then((doc) => {
// delete thumbnail
firebase.storage().ref(doc.data().thumbFullPath).delete()
// delete project document
firebase.firestore().collection('years').doc(yearId).collection('projects').doc(projectId).delete()
firebase.firestore().collection('years').doc(yearId).collection('projects').doc(projectId).collection('images').get()
.then((querySnapshot) => {
querySnapshot.forEach((doc) => {
// delete gallery image
this.imagePaths.append(doc.data().fullPath)
// delete reference document for gallery image
doc.ref.delete()
})
})
})
}
}
}
我的尝试
我认为解决方案将围绕将deleteProject() 转换为异步函数并调用deleteProject().then($emit('reload'))。但是,我一直无法弄清楚如何做到这一点。
编辑
根据要求,reload 触发以下函数:
import firebase from '@/firebase/init'
export const loadGallery = {
data: () => ({
years: []
}),
methods: {
loadProjects () {
var years = []
var temp = []
firebase.firestore().collection('years').orderBy('year', 'desc').onSnapshot((querySnapshot) => {
querySnapshot.forEach((year) => {
firebase.firestore().collection('years').doc(year.id).collection('projects').get().then((querySnapshot) => {
querySnapshot.forEach((project) => {
var objectMicro = { title: project.data().title, thumbUrl: project.data().thumbUrl, route: project.data().route, id: project.id }
temp.push(objectMicro)
})
}).then(() => {
var objectMacro = { year: year.data().year, id: year.id, projects: temp }
years.push(objectMacro)
temp = []
})
})
})
this.years = years
}
}
}
【问题讨论】:
-
您好,您还有问题吗? IE。你还在寻求帮助吗?请回复@RenaudTarnec
-
@RenaudTarnec 我仍然没有找到解决问题的方法,所以是的,仍在寻求帮助。我目前的 hack 修复是创建一个按钮,一旦删除功能运行,用户可以按下该按钮手动触发
reload。 -
看看答案。
标签: javascript firebase vue.js async-await google-cloud-firestore