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

Posted

技术标签:

【中文标题】node js - 当函数依赖于内部的异步函数时,如何从函数返回值【英文标题】:node js - how do I return a value from a function when it depends on asynchronous function inside 【发布时间】: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;
    
);         
;

【问题讨论】:

你试过那个代码了吗?你得到什么错误? 没有错误,问题是我无法从包装函数返回真假。 【参考方案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?

【讨论】:

这是对回调、承诺和异步/等待的极好参考:Async/Await in JavaScript (Youtube) by CodeWorkr, Published on Aug 22, 2017。视频的回购是here

以上是关于node js - 当函数依赖于内部的异步函数时,如何从函数返回值的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 回调函数

node js 回调函数

Node.js 回调函数

Node.js 回调函数

Node.js如何将数组索引传递给异步函数

回调函数