javascript - 必须正确处理 Promise 错误

标签 javascript typescript google-cloud-functions

我正在尝试编写这个基于计时器的函数。它应该每周运行一次并创建现有文档的几乎副本。 每次我尝试启动它时,我都会收到“Promise 必须得到适当处理”错误,但我不明白我做错了什么?任何阶段都有可能回归。 哪里有我没有兑现的 promise ?

我之前已经推出了大约 40 个云函数,所以我确实对 Promise 的工作原理有一些了解,但我显然在这里遗漏了一些东西,而且对于我的一生,我无法理解它是什么。

这是函数:

exports.createRecurringDeals = functions.pubsub.schedule('0 0 * * 7').timeZone('Asia/Jerusalem').onRun((context) => {
    db.collection('recurring_deals').get().then(querySnapshot => {

        querySnapshot.forEach(bus => {
            const businessListDoc = bus.data();

            if (businessListDoc !== undefined) {
                const dealsList = businessListDoc.list as Array<String>

                return db.doc('businesses/' + bus.id).get().then(busDoc => {

                    const business = busDoc.data();

                    if (business !== undefined) {

                        dealsList.forEach(deal => {
                            return db.doc('deals/' + deal).get().then(snapshot => {
                                const oldDeal = snapshot.data();
                                if (oldDeal !== undefined) {

                                    const promises: any = [];

                                    const startTime = oldDeal.startTime + oldDeal.interval;
                                    const endTime = oldDeal.endTime + oldDeal.interval;

                                    const newDealDoc = db.collection('deals').doc();

                                    const newDeal = {
                                        id: newDealDoc.id,
                                        business_ID: business.id,
                                        business_name: business.name,
                                        business_address_text: business.address_text,
                                        business_address_lat: business.address_lat,
                                        business_address_long: business.address_long,
                                        business_phone_number: business.phone_number,
                                        business_image: business.restaurant_photos[0],
                                        business_categories: business.categories,
                                        business_sub_categories: business.sub_categories,
                                        discount: oldDeal.discount,
                                        timestamp_start: startTime,
                                        timestamp_end: endTime,
                                        gmt: oldDeal.gmt,
                                        amount: oldDeal.amount,
                                        claimers: [],
                                        active: true
                                    };

                                    promises.push(newDealDoc.set(newDeal));

                                    promises.push(db.doc('recurring_deals/' + business.id).update({ list: FieldValue.arrayRemove(oldDeal.id) }));

                                    promises.push(db.doc('recurring_deals/' + business.id).update({ list: FieldValue.arrayUnion(newDeal.id) }));

                                    return Promise.all(promises);

                                } else {
                                    return null;
                                };
                            });
                        });
                        return null;
                    } else {
                        return null;
                    };
                });
            } else {
                return null;
            };
        });
        return null;
    });
});

最佳答案

我猜测它希望您在 .then 之后添加一个 .catch() 子句,以防 Promise 由于某种原因失败。例如,尝试更改

return db.doc('deals/' + deal).get().then(snapshot => {
    ...
});

return db.doc('deals/' + deal).get().then(snapshot => {
    ...
}).catch(err => console.log(err));

关于javascript - 必须正确处理 Promise 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58522020/

相关文章:

typescript - 如何使用 typescript 在 vuejs 中向我的数据添加 "File"类型?

typescript - 如何使用 AWS Lambda for Firehose with CDK 启用转换源记录

typescript - 使用 JSPM 和 Typescript 改进 Webstorm 11 中的导入

python - 如何在 python 中的 google cloud firestore 中为时间戳创建条目

node.js - 如何使用 Google Cloud Function HTTP 响应的 brotli 编码发送

javascript - JQuery 中的跨站点 HTTP 身份验证

javascript - 获取状态为CMM Approved的jQuery数据表的数据

javascript - VueJS 2 个输入过滤器组

node.js - 无法在不使用数据库触发器的情况下使用 firebase 云功能更新 firebase 数据库

javascript - 在 AngularJS View 中使用 Waypoints.js