我当时正在做一个项目,所以我决定将所有内容都转换为异步/等待。在了解了它的工作原理之后,我注意到无需util.promisify()就可以使用以下代码。
await transporter.sendMail(message);
之所以会发生这种情况,是因为如果不设置回调参数,该方法将返回Promise。 https://nodemailer.com/usage/
当我运行它时,根据Postman,API大约需要2000ms响应,但是当我将其转换为Promise(在util.promisify的帮助下)时,它需要大约200ms的响应时间,为什么呢? ?
await util.promisify(cb => transporter.sendMail(message, cb));
我是在做错什么,还是承诺比承诺回报更优化?
答案 0 :(得分:3)
那是因为它在骗你。您会注意到您的电子邮件没有得到发送(因此无需等待电子邮件,这意味着更少的时间)。
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
您现在会发现,两者都需要大约相同的时间来做出响应。在这两种情况下,电子邮件实际上都会发送。