我有一个云函数,运行没有错误,但是,在 Promise.all 之后它不会写入数据库
我已经在网络浏览器中测试了这个函数,数据似乎在 Promise.all 之后正确解析。当我将其放入云函数中时,Promise.all 之后的 console.log() 显示原始数据而不是更新的数据,就好像它跳过 forEach 并立即解析一样。当函数在浏览器中运行时,我没有得到这种行为。
最重要的是,如果数据在 Promise 之后,则不会写入 Firestore。在此之前写入的所有数据都会顺利进行。
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");
});
});
});
如有任何帮助,我们将不胜感激!
最佳答案
看来您正在尝试在 getIndex 仍然不可用时使用它,请查看异步操作...使用 async/await 您可以重构代码以使其看起来像这样
exports.scheduledIndexUpdate = functions.pubsub
.schedule("every 30 minutes")
.onRun(async context => {
console.log("This will be run every 30 minutes!");
var newIndex;
var getIndex = await admin.collection("billsIndex")
.doc("GS2019Index")
.get()
.then(doc => doc.exists ? doc.data() : null);
// you have you docs available here
for (let prop of getIndex) {
await admin
.firestore()
.collection("billsMetaData")
.doc(key)
.get()
.then(() => { /..,/ })
// etc
}
await admin.firestore().collection("billsIndex")
.doc("GS2019Index2")
.set({
newIndex
});
return Promise.resolve(/.../)
这样你就可以强制执行等待,直到 promise 得到解决
关于javascript - 我的函数没有正确解析吗?此外,它不会将 firebase 写入数据库。没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56800763/