首页 > 解决方案 > Firebase 循环失败并出现错误(函数返回未定义、预期的 Promise 或值)

问题描述

似乎我的第二个等待循环由于某种原因无法正常工作,因为我收到错误Function returned undefined, expected Promise or value我不确定如何构造此代码以执行功能send_email_process(subscribers, campaigns[index])

(async () => {

    try {

        var campaigns = [];
        var coll = db.collection("campaigns");
        var query = coll.where("campaign_status", "==", "running").where("campaign_group", "==", "email");
        await query.get().then(function (querySnapshot) {
            querySnapshot.forEach(function (doc) {
                campaigns.push(doc.data());
            });
        });

        if (campaigns.length !== 0) {

            console.log("Got here send_email");

            for (let index = 0; index < campaigns.length; index++) {

                const subscribers = [];
                const campaign_lists = campaigns[index].campaign_list;
                for (const campaign_list of campaign_lists) {
                    await db.collection("subscribers").where("subscriber_group", "==", "email").get().then(function (snapshot) {
                        snapshot.forEach(function (d) {
                            const subscriber_lists = d.data().subscriber_list;
                            for (const subscriber_list of subscriber_lists) {
                                if (campaign_list == subscriber_list) {
                                    subscribers.push(d.data());
                                }
                            }
                        });
                    });
                }

                send_email_process(subscribers, campaigns[index]);

            }
        }

    } catch (error) {
        console.error("Failed send_email: " + error);
    }

})();

任何帮助将不胜感激

标签: node.jsfirebasegoogle-cloud-firestorenodemailer

解决方案


混合awaitandthen是可能的,但你需要小心从内部返回一个承诺,then否则await没有什么可等待的。您的then处理程序都没有返回任何内容,因此await可能毫无意义。

我在使用时如何做到这一点await是跳过then块并且:

var coll = db.collection("campaigns");
var query = coll.where("campaign_status", "==", "running").where("campaign_group", "==", "email");
const querySnapshot = await query.get();

const campaigns = querySnapshot.docs.forEach((doc) => doc.data());

then()然后在第二个代码块中进行类似的删除。


推荐阅读