Javascript 如何避免forEach循环在Firebase云函数中获取数据?
我正在使用Firebase云函数向我的用户发送特定数据库事件的推送通知,例如创建数据库条目时 我遵循以下步骤:Javascript 如何避免forEach循环在Firebase云函数中获取数据?,javascript,firebase,firebase-realtime-database,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Google Cloud Functions,我正在使用Firebase云函数向我的用户发送特定数据库事件的推送通知,例如创建数据库条目时 我遵循以下步骤: 创建一个onCreate方法 例如,从其他数据库位置获取附加数据以获取用户信息 发送推送通知 为此,我编写了以下代码: exports.NewEntryNotification = functions.database.ref("entries/{entry}").onCreate((snapshot, context) => { let gu
- 创建一个
方法onCreate
- 例如,从其他数据库位置获取附加数据以获取用户信息
- 发送推送通知
exports.NewEntryNotification = functions.database.ref("entries/{entry}").onCreate((snapshot, context) => {
let guestbookID = snapshot.child("guestbookID").val();
admin.database().ref("guestbooks").orderByChild("id").equalTo(guestbookID).once("value", (snapshot) => {
snapshot.forEach((child) => {
let guestbookOwnerID = child.child("owner").val();
admin.database().ref("users").orderByChild("uid").equalTo(guestbookOwnerID).once("value", (snapshot2) => {
snapshot2.forEach((child2) => {
// Token is:
let userToken = child2.child("pn_token").val();
// If token exists
if (userToken) {
// Push Notification
const payload: admin.messaging.MessagingPayload = {
notification: {
titleLocKey: "new_entry_title",
bodyLocKey: "new_entry_desc",
badge: "1",
}
}
fcm.sendToDevice(userToken, payload);
}
})
});
})
})
});
问题:我的函数处理速度非常慢。我等待了将近5分钟,直到推送通知发送。我认为我在代码中使用了太多的循环。但我发现没有办法以不同的方式获取数据
这是原因吗?还是您在我的代码中发现了其他错误?问题在于您没有正确处理承诺。您的代码必须返回一个承诺,该承诺只有在所有异步工作完成后才能解析,否则它将提前关闭,或者行为异常。请阅读:除了道格提到的,几乎5分钟是恒定的?CF将继续运行5分钟或在之前完成?在日志中,功能在几秒钟后完成。。。。但完成后,主流程开始…主流程运行4-5分钟。。。日志文件中的奇怪行为……嗯,这是一种预期的“奇怪行为”,因为正如@doug stevenson所提到的,您没有正确处理承诺。你能试试他提到的那些文件吗?