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 - 我喜欢按职责对功能进行分组,例如EmailUtil
和EmailOperations
,所以在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 - 当函数依赖于内部的异步函数时,如何从函数返回值的主要内容,如果未能解决你的问题,请参考以下文章