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);
});
我编写了一个发送电子邮件的节点 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);
});