Javascript 如何避免forEach循环在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

我正在使用Firebase云函数向我的用户发送特定数据库事件的推送通知,例如创建数据库条目时

我遵循以下步骤:

  • 创建一个
    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所提到的,您没有正确处理承诺。你能试试他提到的那些文件吗?