将我的代码包含在承诺内或不承诺

时间:2017-11-09 22:06:20

标签: javascript node.js promise async-await

我整天都在脑子里有这个问题,我是一个初学者nodejs开发人员,我想知道我什么时候应该将我的代码包装在使用async / await的promise中,什么时候不应该...... 让我们举例说明我有两个文件:

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

3 个答案:

答案 0 :(得分:2)

根据文档,如果没有给出回调(https://nodemailer.com/usage/),Node Mailer将返回一个承诺。这使得一切都很好用。例如,您可以在mailer.js中执行此操作:

// just return the promise from sendMail() 
module.exports.sender = (mailOptions) => transporter.sendMail(mailOptions)

然后您可以将其与awaitthen()

一起使用
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)

这基本上是你认为最好的。正如您所注意到的,asyncawait使用了承诺。通常我会说承诺和async / await看起来最好,当你有一个明确的线性顺序,你想要发生的事情,而回调看起来更好,当事情可能以不同的顺序发生或可能继续存在多次回电话。在你的例子中我会说await并且承诺会很好地运作,因为逻辑是线性的:“发送电子邮件,然后做一些事情。”

答案 2 :(得分:0)

基本上,只有当代码异步时,您才希望用promise对象包装代码。否则它没有多大意义。

以下是mozilla的Promise定义:

  

Promise表示异步操作的最终完成(或失败)及其结果值。

等待关键字用于使同步代码等待承诺或异步函数/变量(实际上它在幕后包含了承诺)。

在你的情况下,如果邮件,在幕后,返回一个promise,你可以使用await(就像你一样),并且不需要用另一个promise对象包装它。另一方面,如果邮件程序没有返回一个承诺,你需要将它包装好,以便能够等待它。

在这两种情况下,它都会影响邮件程序的实现方式。如果邮件在幕后是同步的,它将不会做任何改变或感觉等待它,因为js引擎将任何如何执行它synchronuousley。

请提供有关邮件程序模块的更多信息,以便我们可以看到整个图片。