【问题标题】:node js - how do I return a value from a function when it depends on asynchronous function insidenode js - 当函数依赖于内部的异步函数时,如何从函数返回值
【发布时间】:2016-02-10 06:42:06
【问题描述】:

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

【问题讨论】:

  • 你试过那个代码了吗?你得到什么错误?
  • 没有错误,问题是我无法从包装函数返回真假。

标签: node.js nodemailer


【解决方案1】:

如果我理解,你所说的“包装函数”是回调函数,所以如果我是正确的,请尝试做这样的事情:

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;

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

【讨论】:

  • 为什么sendEmail : function sendEmail这样放?
  • @JonatasWalker 这是一个很长的答案...简而言之:1 - 我喜欢按职责对功能进行分组,例如EmailUtilEmailOperations,所以在EmailUtil 内部我可以创建isEmailValid(...)checkEmailLenght(...) 之类的函数,在EmailOperations 内部我可以创建sendEmail(...)deleteEmail(...) 之类的函数。 2 - 少写module.exports 声明,因为分组。 3 - 关注点分离。 4 - 还有一点个人喜好:) 当然,我们可以通过多种方式做到这一点,您的回答是另一种方式的示例。干杯!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    猜你喜欢
    • 2020-06-01
    • 2021-04-04
    • 1970-01-01
    • 2015-08-24
    • 2022-01-15
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多