gpt4 book ai didi

Javascript Promise 在 catch block 中解析

转载 作者:搜寻专家 更新时间:2023-10-31 23:37:13 27 4
gpt4 key购买 nike

我有一个返回 promise 的函数 sendMail。

module.exports = function sendMail(mailData) {

const smtpConfig = {
service: 'gmail',
auth: {
user: MAIL_USER,
pass: MAIL_PASS
}
};

const trans = nodemailer.createTransport(smtpConfig);

return new Promise((reject, resolve) => {
trans.sendMail(mailData, (err, result) => {
if (err) {
console.log('error', err)
reject(err);
}
else {
console.log('no error', result)
resolve(result);
}
});
});
}

promise 解决了,记录的输出是:

no error { accepted: [ 'test@test.com' ],
rejected: [],
response: '250 2.0.0 OK 1488900621 j79sm6419250itb.0 - gsmtp',
envelope: { from: '', to: [ 'test@test.com' ] },
messageId: '<511ca80b-0bec-2d06-8f52-81194bcbf26b@My-MacBook-Pro.local>' }

电子邮件已发送。但是,从另一个模块调用该函数时,结果会作为错误传递给 .catch block 。

 module.exports = User = {

sendMail(mailData)
.then((result) => {
console.log('here', result)
})
.catch((err) => {
console.log('error', err)
});

}

产生相同的输出,但作为 catch block 中的错误:

error { accepted: [ 'test@test.com' ],
rejected: [],
response: '250 2.0.0 OK 1488900621 j79sm6419250itb.0 - gsmtp',
envelope: { from: '', to: [ 'test@test.com' ] },
messageId: '<511ca80b-0bec-2d06-8f52-81194bcbf26b@MY-MacBook-Pro.local>' }

并且 .then block 永远不会运行。

非常感谢任何关于我在这里遗漏的帮助。

最佳答案

这里:

return new Promise((reject, resolve) => {

你混淆了函数参数的顺序。无论您如何命名,您的函数都将首先通过 resolve,然后通过 reject,因此您的 resolve 将充当 reject,反之亦然。

应该是:

return new Promise((resolve, reject) => {

传递给 Promise 构造函数的函数的参数名称并不重要,但顺序很重要。因此,例如,您可以使用它来生成已解决的 promise :

new Promise((x, y) => x(123));
// same as Promise.resolve(123);

或者这个来产生一个被拒绝的 promise :

new Promise((x, y) => y(123));
// same as Promise.reject(123);

但是如果你切换 xy 那么它就会不同 - 现在 x 拒绝:

new Promise((y, x) => x(123));
// same as Promise.reject(123);

y解析:

new Promise((y, x) => y(123));
// same as Promise.resolve(123);

查看文档:

Syntax

new Promise( /* executor */ function(resolve, reject) { ... } );

所以谜团不在于它为什么不起作用,而在于它为什么在其他模块中起作用。也许它会做类似的事情:

Promise.reject(3).catch(e => e).then(val => console.log('val:', val));

但当然是使用您的函数而不是 Promise.reject(3) 并使用其他逻辑而不是 console.log

关于Javascript Promise 在 catch block 中解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42652697/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com