【发布时间】:2017-01-07 19:12:46
【问题描述】:
我知道 stackoverflow 充满了类似的问题,而且我已经阅读了很多。
根据我在承诺中得到的throw 应该拒绝它,正如我在documentation 中看到的那样:
如果执行器抛出异常,其值将传递给拒绝解析函数。
但即使在阅读了很多关于 promises 和 throw 的帖子后,我仍然不明白我粘贴的代码的 sn-p 以及它为什么会发生。
function foo(a, b, cb) {
setTimeout(() => {
cb('Inner error *!?"$%&#@"');
}, 0);
}
const getThePromise = () => {
return new Promise((resolve, reject) => {
const cb = (err) => {
/* >>> ************ */
throw err; // catch not called
// reject(err); // catch called
/* ************ <<< */
}
foo('foo', 'dudee', cb);
});
}
getThePromise()
.catch((err) => {
console.log('CATCH:', err);
})
.then((res) => {
console.log('then...');
})
我不明白为什么如果我使用throw,则不会调用承诺的.catch,但如果我使用reject,则会调用它。
为了澄清起见,我在 Mac OS/X 10.11 中使用 Node.js v6.2.2,但我认为这也不可能是浏览器问题。
【问题讨论】:
-
把
.error((err) => { console.log('ERROR:', err); })也放在那里 -
@Shaharyar,原生 Promise.prototype 没有
errorfunction -
throw拒绝仅同步调用的承诺。删除您的setTimeout,它将起作用。在异步情况下使用reject。 -
“如果执行者抛出异常” - 不是你的情况。你的执行人不会扔。试试
new Promise(() => {throw new Error('test')}).catch( e => console.log(e)) -
为什么要抛出错误?这就是
reject方法的重点。
标签: javascript node.js promise throw