【问题标题】:Response time difference with the usage of util.promisify使用 util.promisify 的响应时间差异
【发布时间】:2019-01-14 15:32:52
【问题描述】:

我正在做一个项目,我决定将所有内容都转换为 async/await。在了解了它的工作原理后,我注意到我可以在没有 util.promisify() 的情况下使用以下内容。

await transporter.sendMail(message);

这是因为如果我们不设置回调参数,该方法会返回一个 Promise。 https://nodemailer.com/usage/

当我运行它时,根据 Postman 的说法,API 需要大约 2000 毫秒来响应,但是当我将它变成 Promise(在 util.promisify 的帮助下)时,需要大约 200 毫秒才能得到响应,这是为什么呢?

await util.promisify(cb => transporter.sendMail(message, cb));

我做错了什么,还是只是承诺比承诺回报更优化?

【问题讨论】:

    标签: node.js express async-await nodemailer


    【解决方案1】:

    那是因为它在骗你。您会注意到您的电子邮件没有被发送(因此无需等待电子邮件,这意味着更少的时间)。

    util.promisify() 不返回 Promise。它返回一个返回 Promise 的函数

    const resultOfSendMail = transporter.sendMail(message); // notice, no await
    console.log(resultOfSendMail instanceof Promise); // true
    
    // however
    
    const resultOfPromisify = util.promisify(cb => transporter.sendMail(message, cb));
                              // still no await
    console.log(resultOfPromisify instanceof Promise); // false
    console.log(resultOfPromisify instanceof Function); // true
    

    你使用 Promisify 的方式是传入一个函数,然后得到一个函数。像这样:

    const sendMailAsync = util.promisify((msg, cb) => transporter.sendMail(msg, cb));
    // sendMailAsync is a *function* that takes only message, and returns a Promise!
    await sendMailAsync(message); // This returns a Promise! We can use await
    

    您现在会发现,两者的响应时间大致相同。在这两种情况下,电子邮件都会实际发送。

    【讨论】:

    • 非常感谢您的解释,真的帮了大忙!
    • 现在我注意到,const sendMailAsync = util.promisify((message, cb) => transporter.sendMail(message, cb)); 确实有效,但 const sendMailAsync = util.promisify(transporter.sendMail); 无效。任何线索为什么?这不是问题,因为我认为我掌握了 Promisify 的概念,但我很好奇。
    • @André 我猜sendMail 内部依赖于this 作为传输器。如果是这种情况,箭头函数将被正确绑定,但直接引用不会。如果您仍然希望使用直接引用,则需要绑定它,例如 util.promisify(transporter.sendMail.bind(transporter))
    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2016-03-22
    相关资源
    最近更新 更多