Как сохранить мою функцию, пока я перебираю все документы в коллекции? - PullRequest
0 голосов
/ 21 мая 2019

У меня около 100 документов в коллекции, и я пытаюсь просмотреть все из них, чтобы проверить, больше ли значение поля, чем 0. Если это так, уменьшите его, если оно не переходит к следующему документу. Однако функция как-то перестает выполняться из-за кода состояния 200.

exports.decrementDaysLeft = functions.https.onRequest((req, res) => {
    res.send(startDecrementing());
});

function startDecrementing() {
    db.collection('PremiumUsers').get().then(snapshot => {
        if (!snapshot.empty) 
        {
            console.log("Query Size " + snapshot.size)
            snapshot.forEach(doc => {
                console.log("Checking for user " + doc.id);
                decrementDaysLeftForUser(doc.id);
            })
            return 200;
        }

    }).catch(err => {
        console.log(err);
        return 400;
    });
};

function decrementDaysLeftForUser(email) {
    var userColl = db.collection('PremiumUsers/' + email + '/subscribedSubjects');
     userColl.get().then(snapshot => {
        if (!snapshot.empty) {
            snapshot.forEach(doc => {
                var num = Number(doc.data().daysLeft);
                if (num > 0) {
                    console.log('Checking ' + doc.id);
                    doc.ref.update({
                        daysLeft: (num - 1).toString()
                    }).then(function () {
                        console.log("Decremented " + doc.id + " for " + email);
                    }).catch(err => {
                        log.console(err);
                    })
                }
                else {
                    console.log('Days left is zero ' + doc.data().daysLeft);
                }
            })
        }
        else {
            console.log('No subjects');
        }
    })
};```

1 Ответ

0 голосов
/ 21 мая 2019

Ответ был отправлен до того, как decrementDaysLeftForUser() завершит свое выполнение.Вам нужно дождаться, пока он завершит выполнение, прежде чем отправлять ответ.

Использование ключевого слова await гарантирует, что оно ожидает завершения ожидаемой функции decrementDaysLeftForUser(), прежде чем продолжить выполнение текущей функции startDecrementing(),Примечания: ключевое слово await можно использовать только внутри асинхронной функции.Код будет выглядеть так:

exports.decrementDaysLeft = functions.https.onRequest((req, res) => {
    res.send(startDecrementing());
});

function startDecrementing() {
    db.collection('PremiumUsers').get().then(async (snapshot) => {
        if (!snapshot.empty) 
        {
            console.log("Query Size " + snapshot.size)
            for(let doc of snapshot) {
                console.log("Checking for user " + doc.id);
                await decrementDaysLeftForUser(doc.id);
            }
            return 200;
        }

    }).catch(err => {
        console.log(err);
        return 400;
    });
};

async function decrementDaysLeftForUser(email) {
    var userColl = db.collection('PremiumUsers/' + email + '/subscribedSubjects');
     userColl.get().then(snapshot => {
        if (!snapshot.empty) {
            snapshot.forEach(doc => {
                var num = Number(doc.data().daysLeft);
                if (num > 0) {
                    console.log('Checking ' + doc.id);
                    doc.ref.update({
                        daysLeft: (num - 1).toString()
                    }).then(function () {
                        console.log("Decremented " + doc.id + " for " + email);
                    }).catch(err => {
                        log.console(err);
                    })
                }
                else {
                    console.log('Days left is zero ' + doc.data().daysLeft);
                }
            })
        }
        else {
            console.log('No subjects');
        }
    })
};```

Надеюсь, это поможет.

...