node js - 当函数依赖于内部异步函数时,我如何 return 来自函数的值

node js - how do I return a value from a function when it depends on asynchronous function inside

我编写了一个发送电子邮件的节点 js 模块。该模块是 nodemailer 模块的包装器。当执行 transporter.sendMail 的回调时,我希望我的 wrapper 函数 为 return 如果电子邮件已发送则为 true,否则为 false。我怎样才能做到这一点?这是代码:

var nodemailer = require('nodemailer');

module.exports.sendEmail = function (mailerAddress, mailerPassword, to, subject, html) {
var transporter, mailOptions;

transporter = nodemailer.createTransport({
    service: 'Gmail',
    auth: {
        user: mailerAddress,
        pass: mailerPassword
    }
}); 

mailOptions = {
    from: mailerAddress, 
    to: to,
    subject: subject,
    html: html
};

transporter.sendMail(mailOptions, function(error, info) {
    if (error) {
        return false;
    }
    else {
        return true;
    }
});         
};

如果我理解的话,你说的 "wrapper function" 就是回调函数,所以如果我没看错的话,试着做这样的事情:

var EmailUtil = {
    sendEmail : function sendEmail(mailerAddress, mailerPassword, to, subject, html, callback) {
        var options = {
            service: 'Gmail',
            auth: {
                user: mailerAddress,
                pass: mailerPassword
            }
        };
        var transport = nodemailer.createTransport(options);

        transport.sendMail({
            from: mailerAddress, 
            to: to,
            subject: subject,
            html: html
        }, function(err, responseStatus) {
            var val;
            if (error) {
                val = false;
            } else {
                val = true;
            }
            callback(error, val);
        });
    }
};

module.exports = EmailUtil;

这是我在生产中使用的真实示例。

我认为您不应该这样做,因为您实际上是在尝试将异步操作转变为同步操作。如果您打算这样做,那么我建议您查看使用 async.

的答案

Simplest way to wait some asynchronous tasks complete, in Javascript?

您也可以使用 Promises:

模块

module.exports.sendMail = function(mailOptions) {
  var transporter = ....;
  return new Promise(function(resolve, reject) {
    transporter.sendMail(mailOptions, function(error, info) {
      if (error) {
        reject(error);
      } else {
        resolve(info);
      }
    });
  });
};

应用程序

var module = require('...');
var mail = {
  to: '...',
  from: '...'
};
module.sendMail(mail).then(function(response) {
  console.info(response);
}).catch(function(error) {
  console.info(error);
});