目前,我正在使用云函数来查询帖子。当查询帖子时,我在查询帖子的一些其他更新后为 firebase 设置了一些更新,如下所示:
const getPostsForDate = admin.firestore().collection('posts').where('timeOfDeletion', '<', currentTime)
return getPostsForDate.get().then(snapshot => {
const updates = {}
var counter = 0
const batch = admin.firestore().batch()
snapshot.forEach((doc) => {
var key = doc.id
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++
})
})
if (counter > 0) {
console.log("at the deletion")
return Promise.all[admin.database().ref().update(updates), batch.commit()]
}
else {
console.log("null")
return null
}
})
})
然而,问题是查询 admin.database().ref('convoID/...) 是异步的;因此,更新发送到数据库为空,没有任何变化。现在,解决这个问题的方法是承诺,除了实现 promise.all 和所有其他回报并没有按预期进行。我试过了
var promises = []
snapshot.forEach((doc) => {
var key = doc.id
promises.push(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++
})
)
})
promises.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
}
);
除了我收到错误unexpected token if
,Declaration or statement expected
最后由 promises.all() 这是等待异步调用完成的正确方法吗?
为了结束这个问题,我将尝试总结我们在评论中涵盖的内容:
修复箭头函数定义。改变这个:
promises.all(promises).then(() => code here)
对此:
Promise.all(promises).then(() => { code here });
并且,修复 Promise.all() 的调用。改变这个:
return Promise.all[...]
对此:
return Promise.all([...])
并且,admin.database().ref().once()
将返回一个承诺,但前提是您不通过.once()
常规回调。
所以,改变这个:
promises.push(admin.database().ref('/convoID/' + key).once('value', (snapshot) => { ...}));
对此:
promises.push(admin.database().ref('/convoID/' + key).once('value').then(snapshot => {...}));
而且,如果你改变它的一般结构,它会更干净一点:
let promises = [];
snapshot.forEach((doc) => {
promises.push(...)
});
Promise.all(promises).then(...)
对此:
Promise.all(snapshot.map(doc => {
return admin.database().ref('/convoID/' + key).once(...).then(...);
})).then(...);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句