nodejs-当函数依赖于内部的异步函数时,如何从函数返回值



我已经编写了一个发送电子邮件的node-js模块。该模块是nodemailer模块的包装器。执行transportr.sendMail的回调时,如果发送了电子邮件,我希望包装函数返回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;
    }
});         
};

如果我理解,你说的"包装器函数"就是回调函数,所以如果我是正确的,试着做这样的事情:

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;

这是我在生产中使用的一个真实的例子。

您也可以使用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);
});

我认为你不应该这么做,因为你实际上是在试图将异步操作转化为同步操作。如果你打算这样做,那么我建议你看看这个答案,它使用async

用Javascript等待一些异步任务完成的最简单方法?

最新更新