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块永远不会运行。
对于我在这里缺少的任何帮助,我们将不胜感激。
这里:
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)
但如果你切换x和y那么这将是不同的-现在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)
参见文档:
句法
Run Code Online (Sandbox Code Playgroud)new Promise( /* executor */ function(resolve, reject) { ... } );
因此,谜团不是为什么它不起作用,而是为什么它在其他模块中起作用。也许它确实是这样的:
Promise.reject(3).catch(e => e).then(val => console.log('val:', val));
Run Code Online (Sandbox Code Playgroud)
但使用功能,而不是Promise.reject(3)使用而不是一些其他的逻辑console.log,当然。
| 归档时间: |
|
| 查看次数: |
3277 次 |
| 最近记录: |