使用 util.promisify 的响应时间差异

Response time difference with the usage of util.promisify

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

的情况下使用以下内容
await transporter.sendMail(message);

发生这种情况是因为如果我们不设置回调参数,方法 return 就是一个 Promise。 https://nodemailer.com/usage/

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

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

我是不是做错了什么,或者只是 promise 比 promise 更优化 return?

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

util.promisify() 不是 return Promise。它 return 是一个 函数,return 是一个 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

你会发现,现在两种方式的响应时间大致相同。在这两次中,电子邮件都会被实际发送。