当前,我正在查询数据库中要更新的对象。
是执行此功能的代码段 return getPostsForDate.get().then(snapshot => {
const updates = {}
var counter = 0
const batch = admin.firestore().batch()
snapshot.forEach((doc) => {
var key = doc.id
return admin.database().ref('/convoID/' + key).once('value', (snapshot) => {
if (snapshot.exists()) {
const convoIDCollection = snapshot.val()
for (var child in convoIDCollection) {
console.log(child)
updates["conversations/" + child] = null
updates["messages/"+ child] = null
updates["convoID/"+ child] = null
}
}
updates["/convoID/" + key] = null
updates["/reveals/" + key] = null
updates["/postDetails/" + key] = null
const postFireStoreRef = admin.firestore().collection('posts').doc(key)
const posterRef = admin.firestore().collection('posters').doc(key)
batch.delete(postFireStoreRef)
batch.delete(posterRef)
counter++
console.log(counter)
})
})
if (counter > 0) {
console.log("at the deletion point")
return Promise.all[admin.database().ref().update(updates), batch.commit()]
}
else {
console.log("null")
return null
}
})
基本上,在Firestore查询帖子之后,会从实时数据库接收其他详细信息并将其添加到数组中。最后,我通过承诺提交所有这些更新。但是,从不返回返回更新的函数-为了确保需要对数据库进行更新,我有一个计数器来对更新次数进行计数。如果大于0,我返回
return Promise.all[admin.database().ref().update(updates), batch.commit()]
但是,好像返回函数是在接收到其他详细信息之前执行的,因为它一直在向控制台日志返回“空”,只有在计数器小于0时才会发生。
本质上,在执行更新之前,如何等待数据被查询?
更新
return getPostsForDate.get().then(snapshot => {
const updates = {}
const promises = []
var counter = 0
const batch = admin.firestore().batch()
snapshot.forEach((doc) => {
promises.push (
admin.database().ref('/convoID/' + key).once('value', (snapshot) => {
if (snapshot.exists()) {
const convoIDCollection = snapshot.val()
for (var child in convoIDCollection) {
updates["conversations/" + child] = null
updates["messages/"+ child] = null
updates["convoID/"+ child] = null
}
}
updates["/convoID/" + key] = null
updates["/reveals/" + key] = null
updates["/postDetails/" + key] = null
const postFireStoreRef = admin.firestore().collection('posts').doc(key)
const posterRef = admin.firestore().collection('posters').doc(key)
batch.delete(postFireStoreRef)
batch.delete(posterRef)
counter++
})
)
})
Promise.all(promises).then(() => {
if (counter > 0) {
console.log("at the deletion")
return Promise.all[admin.database().ref().update(updates), batch.commit()]
}
else {
console.log("null")
return null
}
})
})
})
答案 0 :(得分:1)
admin.database().ref('/convoID/' + key).once(...)
是异步的并返回一个承诺,但是您的代码没有使用这些承诺来等待每个查询完成。这意味着您的代码将在快照迭代之后,计数器更新或添加批处理之前立即移至if / else。
您需要重组代码,以将一次()中的所有诺言收集到一个数组中,使用Promise.all()
等待所有诺言得到解决,然后提交批处理。