【问题标题】:Firebase loop fails with error (Function returned undefined, expected Promise or value)Firebase 循环失败并出现错误(函数返回未定义、预期的 Promise 或值)
【发布时间】:2021-12-13 12:10:35
【问题描述】:

我的第二个等待循环似乎由于某种原因无法正常工作,因为我收到错误 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.js firebase google-cloud-firestore nodemailer


    【解决方案1】:

    混合awaitthen 是可能的,但是你需要小心从then 中返回一个promise,否则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() 进行类似的删除。

    【讨论】:

    • 嗨@Shina,是answer你的问题吗?请考虑支持并接受它。谢谢
    猜你喜欢
    • 2018-04-18
    • 2018-12-03
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2018-12-05
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多