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

await transporter.sendMail(message);

这是因为如果不设置回调参数,该方法将返回一个promise。https://nodemailer.com/usage/
当我运行它时,根据postman的说法,api需要大约2000毫秒才能响应,但是当我将它变成一个承诺(在util.promisify的帮助下)时,需要大约200毫秒才能得到响应,这是为什么?
await util.promisify(cb => transporter.sendMail(message, cb));

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

最佳答案

那是因为它在骗你。你会注意到你的电子邮件没有被发送(所以不要等待电子邮件,这意味着更少的时间)。
util.promisify()不返回承诺。它返回一个返回承诺的函数:

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

现在你会发现,在这两种情况下,几乎需要同样的时间来做出反应。在这两种情况下,邮件都会被发送出去。

关于node.js - 使用util.promisify的响应时间差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51728542/

10-11 08:54