node.js - 如何在继续执行函数之前等待循环中的所有回调

标签 node.js promise callback async-await

我有一个接收用户数据的函数,在该数据中我有一个电子邮件数组,可以使用 Node 邮件程序在给定的电子邮件数组上发送电子邮件

现在我尝试使用 foreach 循环来迭代数组,并且在每次迭代时我使用回调函数来检查给定的电子邮件是否存在

(使用 whoisxmlapi.com 服务),如果电子邮件有效或无效,则返回 然后如果电子邮件有效,则通过 Nodemailer 发送邮件,否则无效

回调工作正常,但运行此 foreach 循环的函数在回调返回之前进一步移动(我想等到所有电子邮件都经过验证并发送)

/* tried[1]  async here */  function sendMails(fields) { 
var transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 587,
    secure: false,
    requireTLS: true,
    auth: {
        user: email_from,
        pass: password
    }
});
var mailOptions = {
    from: email_from,
    to: _send_to_.toString(),
    subject: fields.email_subject,
    text: fields.msg_type == 'text' ? fields.message_text : '',
    html: fields.msg_type == 'html' ? fields.message_text : ''
};
let __vs_status__ = {
    email: email,
    email_v: false,
    email_s: false
};
_send_to_ = fields.emails
_send_to_.forEach( /* tried[2]  async here */ email => {
    var verifyEmail = /* tried[2] await here */  verifyEmailExist(email, (ev) => {
        console.log(ev.smtpCheck)
        if (ev.smtpCheck == 'true') {

            __vs_status__.email_v = true
            transporter.sendMail(mailOptions, function (error, info) { //want to wait for this too but couldn't test bcz valid email wait was not working properly
                if (error) {
                    console.log(error);
                    __vs_status__.email_s = false
                } else {
                    __vs_status__.email_s = true
                }
            });
        }
        // console.log('pushing')
        __email__info.push(__vs_status__)
        //    console.log(__email__info)
    })
});
console.log(/* tried[1]  await here */ __email__info) // this prints before loop and callbacks gets completed (don't want that)
}

// ----------------------------- EMAILS EXIST CHECK CALLBACK ---------------
function verifyEmailExist(email, callback) {
console.log('callback ' + email)
var email = email;
var api_key = apikey;
var api_url = 'https://emailverification.whoisxmlapi.com/api/v1?';
var url = api_url + 'apiKey=' + api_key + '&emailAddress=' + email;
https.get(url, function (response) {
    var str = '';
    response.on('data', function (chunk) {
        str += chunk;
    });
    response.on('end', function () {
        callback(JSON.parse(str));
    });
}).end();
}

我希望 foreach 循环在进一步移动之前完成,并在 foreach 循环中验证电子邮件和发送状态

只是无法完成

我尝试过异步/等待但没有成功(尝试过[引用]异步/尝试过[引用]等待)

您可以通过安装所需的 Node 包并将一组电子邮件传递给函数 sendMails 来测试代码(并验证电子邮件,您需要一个 api key )

最佳答案

async/await 在这里并不重要,因为它本质上会包装/解开 promise (您没有使用)

我真的没有看到这里有问题。您的 console.log(__email__info)__email__info.push(__vs_status__) 都需要位于 transporter.sendMail

的回调中>

所以,如下:

_send_to_.forEach( /* tried[2]  async here */ email => {
  verifyEmailExist(email, (ev) => {
    console.log(ev.smtpCheck)
    if (ev.smtpCheck == 'true') {

        __vs_status__.email_v = true
        transporter.sendMail(mailOptions, function (error, info) { //want to wait for this too but couldn't test bcz valid email wait was not working properly
            if (error) {
                console.log(error);
                __vs_status__.email_s = false
            } else {
                __vs_status__.email_s = true
            }
            __email__info.push(__vs_status__)
            console.log(/* tried[1]  await here */ __email__info)
        });
    }
  })
});

关于node.js - 如何在继续执行函数之前等待循环中的所有回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57477656/

相关文章:

javascript - 如何在 Node.js 中使用异步函数返回的数据?

node.js - 添加新的 save-dev 依赖项后如何让 npm 5 更新锁定文件?

node.js - 将 knex SELECT 查询结果用于另一个 SELECT 查询

c# - ReaderWriterLockSlim 使用 Socket.BeginReceive 引发 LockRecursionException

multithreading - 用于异步 Web 服务的 Java ExecutorService

node.js - 查询缓慢/延迟空集合Nodejs MongoDB

node.js - Nodejs 和 mongoose 中基于角色的登录

c++ - std::future_error:无关联状态

node.js - promise 阻止 Node 进程退出

python - 了解 Scrapy 中的回调