【问题标题】:Wrap my code inside a promise or not是否将我的代码包装在一个承诺中
【发布时间】:2018-04-23 01:40:12
【问题描述】:

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

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) {
}

我是否应该将 sender 函数包装在一个 promise 中,以便像这样调用它:

await mailer.sender(mailOptions)

或者我的例子很好,我不需要承诺? 希望你明白我的意思



编辑 :

我正在使用来自 npm 的 nodemailer 包:
https://www.npmjs.com/package/nodemailer

【问题讨论】:

  • 你应该做任何你觉得更舒服的事情。 async / await 模式更容易阅读,但您不需要使用它。
  • 这是关于使用 Promise 与回调的问题,还是关于何时使用 async/await 的问题(已经需要 Promise)?
  • 看起来您没有为sendMail 提供函数,而是调用callback() 的结果似乎不正确。另外,这是 Node Mailer 吗?如果你不通过回调,它不是已经返回了一个承诺吗?
  • @link0047 谈论更容易阅读,我认为 await mailer.sender(mailOptions) 或 mailer.sender(mailOptions) 都很容易阅读......如果不是,请解释容易的事情来自哪里
  • @Mark_M 是的,我验证了它并且它不起作用,我只是给sendMail 一个匿名函数并且它现在正在工作......所以在这一点上我不能给它一个命名函数?跨度>

标签: javascript node.js promise async-await


【解决方案1】:

根据文档,如果没有给出回调,Node Mailer 将返回一个承诺 (https://nodemailer.com/usage/)。这使得一切都非常好用。例如,您可以在 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)

【讨论】:

    【解决方案2】:

    基本上就是你认为最好看的东西。正如您所注意到的,asyncawait 在后台使用了 Promise。一般来说,我会说 promises 和 async/await 当你有一个明确的线性顺序时你希望事情发生时看起来最好,而当事情可能以不同的顺序发生或可能在多个事件中不断被回调时,回调看起来更好场合。在您的示例中,我会说 await 并且承诺会很好地工作,因为逻辑是线性的:“发送电子邮件,然后做某事。”

    【讨论】:

    • aaah 你的意思是如果邮件没有发送,我必须将它包裹在 try catch 中以阻止其他事情?!
    • 有了 Promise,你可以在调用链中使用.catch,而有了async/await,你可以使用try/catch。使用回调,处理程序将获得错误参数。
    • 所以async/await 的效用是使用try/catch 我可以在遇到错误时停止其他事情?
    【解决方案3】:

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

    这是 mozilla 的 Promise 定义:

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

    Await 关键字用于使同步代码等待一个 Promise 或异步函数/变量(实际上是在幕后用 Promise 包装的)。

    在您的情况下,如果邮件程序在幕后返回一个 Promise,您可以在其上使用 await(就像您所做的那样),并且不需要用另一个 Promise 对象包装它。另一方面,如果 mailer 没有返回一个 Promise,你需要用 Promise 包装它才能等待它。

    在这两种情况下,它都取决于邮件程序的实现方式。如果邮件程序在幕后是同步的,那么等待它不会有任何改变或意义,因为 js 引擎会以任何方式同步执行它。

    请提供有关邮件模块的更多信息,以便我们查看全貌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2019-12-29
      • 2016-02-23
      • 2017-06-19
      • 2016-09-20
      相关资源
      最近更新 更多