У меня есть облачная функция, которая работает без ошибок, однако она не будет записывать в базу данных после Promise.all
Я протестировал эту функцию в веб-браузере, и данные, кажется, разрешаютсяправильно после Promise.all.Когда я помещаю это в облачную функцию, console.log () после Promise.all показывает исходные данные, а не обновленные, как если бы он пропускал forEach и сразу же разрешал.Я не получаю такого поведения, когда функция запускается в браузере.
Кроме того, данные не будут записываться в Firestore, если это происходит после Promise. Любая запись данных до того, как это произойдет, просто замечательно.
exports.scheduledIndexUpdate = functions.pubsub
.schedule("every 30 minutes")
.onRun(context => {
console.log("This will be run every 30 minutes!");
var newIndex;
var getIndex = new Promise((resolve, reject) => {
admin
.firestore()
.collection("billsIndex")
.doc("GS2019Index")
.get()
.then(doc => {
if (doc.exists) {
newIndex = doc.data();
resolve(newIndex);
}
});
});
return getIndex.then(index => {
var keys = Object.keys(index);
keys.forEach(function(key) {
admin
.firestore()
.collection("billsMetaData")
.doc(key)
.get()
.then(doc => {
if (doc.exists) {
const metaData = doc.data();
let agree = 0,
disagree = 0,
neutral = 0,
somewhatAgree = 0,
somewhatDisagree = 0;
if (metaData.votes) {
if (metaData.votes.agree) {
agree = metaData.votes.agree;
}
if (metaData.votes.disagree) {
disagree = metaData.votes.disagree;
}
if (metaData.votes.neutral) {
neutral = metaData.votes.neutral;
}
if (metaData.votes.somewhatAgree) {
somewhatAgree = metaData.votes.somewhatAgree;
}
if (metaData.votes.somewhatDisagree) {
somewhatDisagree = metaData.votes.somewhatDisagree;
}
newIndex[key].userVotes =
agree + disagree + neutral + somewhatAgree + somewhatDisagree;
}
}
});
});
Promise.all(keys).then(function(result) {
admin
.firestore()
.collection("billsIndex")
.doc("GS2019Index2")
.set({
newIndex
});
console.log(newIndex);
console.log("done");
});
});
});
Любая помощь будет оценена!