index.js
var mailer = require('../mailer')
var mailOptions = mailer.mailOptions(......)
mailer.sender(mailOptions)
mailer.js:
module.exports.mailOptions = (.......) => {
....
}
module.exports.sender = (mailOptions) => {
transporter.sendMail(mailOptions, callback(err, info))
}
function callback(err, info) {
}
我应该将发件人函数包装在promise中,以便像这样调用它:
await mailer.sender(mailOptions)
或者我的榜样很好,我不需要承诺? 希望你明白我的意思
编辑:
我从npm使用nodemailer包:
https://www.npmjs.com/package/nodemailer
答案 0 :(得分:2)
根据文档,如果没有给出回调(https://nodemailer.com/usage/),Node Mailer将返回一个承诺。这使得一切都很好用。例如,您可以在mailer.js中执行此操作:
// just return the promise from sendMail()
module.exports.sender = (mailOptions) => transporter.sendMail(mailOptions)
然后您可以将其与await
或then()
try{
let info = await mailer.sender(mailOptions)
console.log(info.messageId) // etc
} catch(err){
console.log("Error:", err)
}
或
mailer.sender(mailOptions)
.then(info => console.log(info.messageId)
.catch(err => console.log("Error:", err)
答案 1 :(得分:0)
这基本上是你认为最好的。正如您所注意到的,async
和await
使用了承诺。通常我会说承诺和async
/ await
看起来最好,当你有一个明确的线性顺序,你想要发生的事情,而回调看起来更好,当事情可能以不同的顺序发生或可能继续存在多次回电话。在你的例子中我会说await
并且承诺会很好地运作,因为逻辑是线性的:“发送电子邮件,然后做一些事情。”
答案 2 :(得分:0)
基本上,只有当代码异步时,您才希望用promise对象包装代码。否则它没有多大意义。
以下是mozilla的Promise定义:
Promise表示异步操作的最终完成(或失败)及其结果值。
等待关键字用于使同步代码等待承诺或异步函数/变量(实际上它在幕后包含了承诺)。
在你的情况下,如果邮件,在幕后,返回一个promise,你可以使用await(就像你一样),并且不需要用另一个promise对象包装它。另一方面,如果邮件程序没有返回一个承诺,你需要将它包装好,以便能够等待它。
在这两种情况下,它都会影响邮件程序的实现方式。如果邮件在幕后是同步的,它将不会做任何改变或感觉等待它,因为js引擎将任何如何执行它synchronuousley。
请提供有关邮件程序模块的更多信息,以便我们可以看到整个图片。