首页 > 解决方案 > 异步函数进行的重复调用

问题描述

以下内容旨在对数据库进行各种调用,以拉取必须通过电子邮件发送的用户,并向每个用户发送个性化消息。emailService.sendEmail 调用正常工作的 smtp nodemailer 服务。但是,该函数会并行执行多次,从而导致向每个收件人发送 3 次电子邮件。例如,'const response = await SQL.getProjectsWithCurrentUTCDate();' 正在返回两个不同的响应,每个响应都遍历整个函数。

var job = schedule.scheduleJob('*/15 * * * *', async function () {

        try {

            // first, get projects that have a reminder date or start date of current day
            const response = await SQL.getProjectsWithCurrentUTCDate();


            // next, for each project
            response.rows.forEach(async function (project) {
                // Create a projectData object
                var projectData = new Object();
                projectData.projectName = project.name;
                projectData.startDate = project.start_date.toISOString().substring(0, 10);
                try { projectData.reminder1Date = project.first_reminder_date.toISOString().substring(0, 10); } catch (ignore) { }
                try { projectData.reminder2Date = project.second_reminder_date.toISOString().substring(0, 10); } catch (ignore) { }
                projectData.endDate = project.end_date.toISOString().substring(0, 10);
                projectData.fields = project.fields;
                // get revalidator emails who have incomplete revalidations for the given project
                const secondResponse = await SQL.getRevalidatorsForIncompleteRevalidationsForProjectId(project.id);
                // finally, send email to those revalidators
                const emailMessage = EmailService.emailMessageFromProjectData(projectData);
                secondResponse.rows.forEach(function (element) {

                    //var sent = false;
                    //console.log("sent= " + sent);


                    const data = {
                        from: project.email,
                        to: [element['revalidator_email']],
                        subject: project.subject,
                        message: emailMessage.replace(/@@EMAIL@@/g, element['revalidator_email'])
                    };

                    EmailService.sendEmail(data); 


                });
            });

        } catch (err) {
            console.log('Email scheduler failed with error: ' + err);
        }
    });

标签: javascriptnode.jspostgresqlasync-await

解决方案


推荐阅读