Ответ был отправлен до того, как 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');
}
})
};```
Надеюсь, это поможет.