我有一个Google Cloud功能,我需要循环浏览一系列Firestore文档,然后对某个字段进行检查。一旦检查完成,然后将该字段添加到我称为 item 的对象中。完成此操作后,我便有了一个.then()
函数,该函数将 item 合并到文档中。
问题在于,在最终返回之后,forEach循环中的此返回将返回,这意味着将 item 添加到文档中而没有必填字段。
我不确定Promises
可能有问题,尽管我不确定。
这是我的职能:
function updateReferenceToComplete(refDoc: any, contract_type: string, contract_pdf: string, guarantorData: any, custom_fields: any) {
let item: any;
return refDoc.get()
.then((data: any) => {
const reference = data.data();
item = {
date_modified: new Date(),
date_signed: new Date(),
tenancy_offers: {},
status: 'complete',
agreement_url: contract_pdf,
custom_fields: custom_fields,
};
Object.keys(reference.tenancy_offers).forEach((key: string) => {
console.log('KEYS: ', key);
if (isNull(reference.tenancy_offers[key])) {
const offerDoc = db.collection('tenancy_offers').doc(key);
return offerDoc.get()
.then((offerData: any) => {
const offer = offerData.data();
if (offer.status === 'incomplete' && !offer.is_deleted) {
item.tenancy_offers[key] = new Date();
console.log('ITEM IN FOR EACH: ', item);
} else {
item.tenancy_offers[key] = null;
}
})
} else {
return null
}
});
}).then(() => {
console.log('ITEM AFTER LOOP: ', item);
return refDoc.set(item, {merge: true})
.then(() => console.log('done'))
.catch((err: any) => console.log(err))
})
}
因此,您可以看到我在循环期间和循环之后对日志项进行控制台操作,但是首先记录日志“ AFTER”,然后才记录循环,这意味着tenancy_offer
对象在firestore中保持空白。
答案 0 :(得分:3)
offerDoc.get().then()
是异步的,并返回一个Promise。使用then()
不会使您的代码停止运行并等待承诺被解决-它只会返回另一个承诺。也许您想将这些诺言收集到一个数组中,并使用Promise.all()
等待所有诺言完成,然后再进入下一阶段。