【问题标题】:Javascript Promise resolving in catch blockJavascript Promise 在 catch 块中解析
【发布时间】:2017-07-27 22:06:03
【问题描述】:

我有一个函数 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 块。

 module.exports = User = {

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

}

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

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 块永远不会运行。

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

【问题讨论】:

  • 但是从另一个模块调用函数 - 当它工作正常时你在哪里调用它?
  • 我在您的代码中看到的一个问题是 return new Promise((reject, resolve) =&gt; { 应该是 return new Promise((resolve, reject) =&gt; { 解析器在拒绝器之前梳理。

标签: javascript node.js error-handling es6-promise


【解决方案1】:

这里:

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

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

应该是:

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

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

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

或者这样产生一个被拒绝的承诺:

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);

查看文档:

语法

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

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

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

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

【讨论】:

  • 哇,我以为它很小,但它逃脱了我。感谢您抽出宝贵时间@rsp。
猜你喜欢
  • 2020-06-27
  • 2019-08-13
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2018-03-20
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多