你差不多了解诺言。看起来你也在将回调与Promises混合在一起。 Firebase的Firebase和云端功能完全基于Promise,因此不需要。
虽这么说,你的代码看起来应该像下面这样:
exports.sendVenueAnnouncement = functions.database
.ref(`/venueAnnouncements/${venueUid}/announcement`)
.onCreate(event => {
const venueUid = event.params.venueUid
const announcement = event.data.val()
let payload
let tokens = []
return admin.database()
.ref(`verifiedVenues/${venueUid}/displayname`)
.once('value')
.then(snapshot => {
const displayname = snapshot.val()
payload = {
notification: {
title: `${displayname}`,
body: `${announcement}`
}
}
return admin.database().ref(`subscribers/${venueUid}`).once('value')
})
.then(snapshot => {
snapshot.forEach((childSnapshot) => {
const key = childSnapshot.key
const token = admin.database().ref(`pushTokens/` + key).once('value')
tokens.push(token)
})
return Promise.all(tokens)
})
.then(values => {
return admin.messaging().sendToDevice(values, payload)
})
.then(response => {
const tokensToRemove = []
response.results.forEach((result, index) => {
const error = result.error
if (error) {
if (error.code === 'messaging/invalid-registration-token' || error.code === 'messaging/registration-token-not-registered') {
tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove())
}
}
})
return Promise.all(tokensToRemove)
})
})
通知我不分配承诺给一个变量。只要返回并链接then
。一个承诺可以返回另一个承诺。
我建议观看this Firecast更好地理解Promise。
非常感谢,弗朗西斯科!知道我是在了解他们的悬崖上,但却无法摆脱边缘。通常,我喜欢尽我所能自行解决问题,但我达到了让我感受到无法忍受的无奈的挫折感。感谢您花时间帮忙!我一定会给那个Firecast一块手表。 – AdamJosephNavarro
得到实现你的建议代码,不幸的是仍然导致一个混乱的数组与每个推令牌深深地嵌套在一个对象中。与此链接中显示的内容类似:https://stackoverflow.com/questions/43647534/why-does-returning-snapshot-val-in-a-promise-when-using-promise-all-not-work – AdamJosephNavarro