Облачная функция Firebase завершена до завершения работы foreach - PullRequest
2 голосов
/ 30 октября 2019

Я хочу обновить список «Резервирований» новыми переменными. Но я не могу заставить его работать, потому что функция заканчивается перед обновлением. Я знаю, что проблема в том, что я делаю асинхронные вызовы, но не могу ее решить. Как я могу использовать Promise в этом случае?

Я отредактировал код с помощью Promise, но по-прежнему не обновляю «Reservations» Возвращает {«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" };;
});
})

1 Ответ

1 голос
/ 30 октября 2019

Эта функция будет выполняться немедленно каждый раз, когда она вызывается, и, вероятно, не будет выполнять ни одну из своих работ. Это потому, что он вообще ничего не возвращает из функции обратного вызова верхнего уровня. Вместо этого вам нужно вернуть обещание из верхнего уровня функции, которая разрешается с данными, чтобы отправить клиенту только после того, как все асинхронная работа завершена (и вы многое ее запускаетеВот). Правильная обработка обещаний имеет решающее значение для правильной работы облачных функций.

...