forEach循环在实际返回之前返回(节点)

时间:2019-03-19 15:55:03

标签: javascript node.js google-cloud-firestore google-cloud-functions

我有一个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中保持空白。

1 个答案:

答案 0 :(得分:3)

offerDoc.get().then()是异步的,并返回一个Promise。使用then()不会使您的代码停止运行并等待承诺被解决-它只会返回另一个承诺。也许您想将这些诺言收集到一个数组中,并使用Promise.all()等待所有诺言完成,然后再进入下一阶段。