JavaScript的承诺解决catch块

R. *_*son 3 javascript error-handling node.js es6-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);
   }
  });
 });
}
Run Code Online (Sandbox Code Playgroud)

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>' }
Run Code Online (Sandbox Code Playgroud)

电子邮件已发送。然而调用从另一个模块的功能,其结果被传递给.catch块为错误。

 module.exports = User = {

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

}
Run Code Online (Sandbox Code Playgroud)

生成相同的输出,但作为在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>' }
Run Code Online (Sandbox Code Playgroud)

.then块永远不会运行。

对于我在这里缺少的任何帮助,我们将不胜感激。

rsp*_*rsp 5

这里:

return new Promise((reject, resolve) => {
Run Code Online (Sandbox Code Playgroud)

你混在一起的功能参数的顺序。你会被传递给resolve第一和reject第二,无论你如何命名它,所以你resolve将作为reject反之亦然和副。

它应该是:

return new Promise((resolve, reject) => {
Run Code Online (Sandbox Code Playgroud)

的参数,你传递给无极构造无关紧要的功能名称,但订单事宜。因此,例如,你可以用它来产生一个解决的承诺:

new Promise((x, y) => x(123));
// same as Promise.resolve(123);
Run Code Online (Sandbox Code Playgroud)

或本产生拒绝承诺:

new Promise((x, y) => y(123));
// same as Promise.reject(123);
Run Code Online (Sandbox Code Playgroud)

但如果你切换xy那么这将是不同的-现在x拒绝:

new Promise((y, x) => x(123));
// same as Promise.reject(123);
Run Code Online (Sandbox Code Playgroud)

y做出决议:

new Promise((y, x) => y(123));
// same as Promise.resolve(123);
Run Code Online (Sandbox Code Playgroud)

参见文档:

句法

new Promise( /* executor */ function(resolve, reject) { ... } );
Run Code Online (Sandbox Code Playgroud)

因此,谜团不是为什么它不起作用,而是为什么它在其他模块中起作用。也许它确实是这样的:

Promise.reject(3).catch(e => e).then(val => console.log('val:', val));
Run Code Online (Sandbox Code Playgroud)

但使用功能,而不是Promise.reject(3)使用而不是一些其他的逻辑console.log,当然。