javascript - Firebase云函数在完成foreach之前完成

标签 javascript firebase promise google-cloud-functions

我想用一些新变量更新“预订”列表。但我无法让它工作,因为该函数在更新之前结束。我知道问题是因为我进行了异步调用,但我无法解决它。在这种情况下我该如何使用 Promise?

我使用 Promise 编辑了代码,但仍然没有更新“预订” 将 {"data": null} 返回到我的网站控制台 在firebase控制台中不会生成任何错误。返回消息“预订已实现”

exports.actualizeReservations = functions.https.onCall((data, response) => {
var promisesUpdateReservations = [];
return admin.database().ref(Constants.RESERVATIONS).once("value")
.then((snapshot) => {
    console.log("RESERVATIONS: " + snapshot)
    snapshot.forEach((reserveSnap) => {
        var reserve = reserveSnap.val();
        if(reserve.reservationId && reserve.restoId) {
            admin.database().ref(`${Constants.RESTAURANTS}/${reserve.restoId}`).once("value")
            .then((restoSnap) => {
                if(restoSnap.exists() && restoSnap.val() !== null) {
                    var resto = restoSnap.val();
                    if(resto.address && !resto.address.fullAddress) {
                        var restoAddress = resto.address ? {
                            street: resto.address.street ? resto.address.street : "",
                            fullAddress: resto.address.fullAddress ? resto.address.fullAddress : "",
                            city: resto.address.city ? resto.address.city : "",
                            country: resto.address.country ? resto.address.country : "",
                            postalCode: resto.address.postalCode ? resto.address.postalCode : "",
                            province: resto.address.province ? resto.address.province : "",
                            l: resto.l ? resto.l : null,
                            g: resto.g ? resto.g : null,
                        } : null;
                        var restoUserIDs = `${reserve.restoId}/${reserve.userId}`;
                        const promiseUpdateReservation = admin.database().ref(`${Constants.RESERVATIONS}/${reserve.reservationId}`).update({
                            restoAddress,
                            restoUserIDs
                        })
                        promisesUpdateReservations.push(promiseUpdateReservation)
                    }
                }
            })
            .catch((err) => {
                console.log("resto not found")
            });
        }
    });
    Promise.all(promisesUpdateReservations)
    .then(() => {
        console.log("reservations actualized");
        return { code: 0, result: "successful", description: "reservations actualized" };
    })
})
.catch((err) => {
    console.log("get restaurants error: " + err);
    return { code: 1, result: "successful", description: "reservations not loaded" };;
});
})

最佳答案

该函数每次调用时都会立即完成,并且可能不执行任何工作。这是因为它根本没有从顶级函数回调返回任何内容。相反,您需要从函数的顶层返回一个 promise ,该 promise 仅在所有异步工作完成后才解析为发送到客户端的数据(并且您正在启动很多工作)在这里)。正确处理 Promise 对于使 Cloud Functions 正常工作至关重要。

关于javascript - Firebase云函数在完成foreach之前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58616103/

相关文章:

database - 在保存之前验证 Firebase JSON 的结构

javascript - 如何将对象包装在 Promise 中?

javascript - 在 Promise.prototype.then() 中传递参数

javascript - HTML 根据 div 高度 chop 内容

javascript - 如何在 NodeJS 中的 .txt 文件中添加新行文本

javascript - 在jquery中通过类名获取div id

java - Firestore 如何按我的文档中引用的另一个文档中的字段进行排序?

javascript - 如何将 Angular forEach 与 firebase 一起使用

javascript - 如何在 IE8 中触发自定义 javascript 事件?

javascript - 使用 async/await 继续执行