gpt4 book ai didi

javascript - 在调用 sendToDevice 之前,将 Promise.All 与 Firebase Cloud Fxs 结合使用,用 FCM token 填充数组

转载 作者:行者123 更新时间:2023-12-01 03:20:02 28 4
gpt4 key购买 nike

我想知道是否有人可以帮助我了解如何在触发 sendToDevice() 之前成功执行此代码,直到整个数组都充满 FCM token 。

我一直在使用这些链接(如下所列)作为引用来尝试解决此问题,但我仍然无法弄清楚,所以唉,我在这里寻求指导。我只需要在 tokens 数组完全填满后传递它。我已经得到了它在每次 push 时多次触发的地方,但从未在异步加载然后触发的地方得到过><

Firebase Real Time Database Structure for File Upload

Promise.all with Firebase DataSnapshot.forEach

https://aaronczichon.de/2017/03/13/firebase-cloud-functions/

exports.sendVenueAnnouncement = functions.database.ref(`/venueAnnouncements/{venueUid}/announcement`).onCreate(event => {
const venueUid = event.params.venueUid;
const announcement = event.data.val();

const getVenueDisplaynamePromise = admin.database().ref(`verifiedVenues/${venueUid}/displayname`).once('value');
return getVenueDisplaynamePromise.then(snapshot => {
const displayname = snapshot.val();
const payload = {
notification: {
title: `${displayname}`,
body: `${announcement}`
}
};
const getSubscriberTokensPromise = admin.database().ref(`subscribers/${venueUid}`).once('value');
return getSubscriberTokensPromise.then(snapshot => {
const tokens = [];
snapshot.forEach(function(childSnapshot) {
const key = childSnapshot.key;
const token = admin.database().ref(`pushTokens/` + key).once('value');
tokens.push(token);
});
return Promise.all(tokens);
}, function(error) {
console.log(error.toString())
}).then(function(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)
});
})
})
})

最佳答案

几乎已经了解了 Promise。看来您还将回调与 Promise 混合在一起。 Firebase 和 Firebase 的 Cloud Functions 完全基于 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)
})
})

注意,我没有将 Promise 分配给变量。只需返回它并链接一个 then 即可。一个 Promise 可以返回另一个 Promise。

我建议观看this Firecast 可以更好地理解 Promise。

关于javascript - 在调用 sendToDevice 之前,将 Promise.All 与 Firebase Cloud Fxs 结合使用,用 FCM token 填充数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45286812/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com