我正在尝试学习promises,使用打字稿,我遇到了一些问题,了解导致这种vscode调试行为的原因。
以下是一个例子:
// example 1
new Promise((resolve, reject) => {
reject("test1"); // debugger stops as on uncaught exception
})
.catch(
error => {
console.log(error);
}
);
// output: "test1"
和
//example 2
new Promise((resolve, reject) => {
setTimeout(() => {
reject("test2"); // debugger never stops
});
})
.catch(
error => {
console.log(error);
}
);
// output: "test2"
正如您在一个案例中看到的那样,调试器在promise promise中停止,但在其他情况下,不是。但是在所有情况下都会收到错误,并且没有未处理的异常。
我使用的是vscode特定行为还是es6-promise绑定?或者我做错了吗?有人遇到过同样的问题吗?
答案 0 :(得分:1)
这是VSCode挂钩使用的Chrome调试器的启发式算法。他们假设同步拒绝是通常程序员错误,你想要打破(如拼写错误)而异步错误则不是因为他们通常是IO(读取文件)。
这是一个非常愚蠢的启发式方法,但它通常对某些情况有意义。您可以做的一件事是包括用于调试版本的bluebird(如果你不是Promise
,则它是100%兼容的)然后添加一个未处理的拒绝钩子:
Promise.onPossiblyUnhandledRejection(function(e, promise) {
throw e;
});
使用更好的启发式方法。您也可以使用本机承诺(拒绝事件)执行此操作,但我不知道如何关闭同步投掷的自动中断。