typescript承诺拒绝和vscode调试器行为

时间:2016-08-21 10:40:33

标签: typescript error-handling promise visual-studio-code es6-promise

我正在尝试学习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绑定?或者我做错了吗?有人遇到过同样的问题吗?

1 个答案:

答案 0 :(得分:1)

这是VSCode挂钩使用的Chrome调试器的启发式算法。他们假设同步拒绝是通常程序员错误,你想要打破(如拼写错误)而异步错误则不是因为他们通常是IO(读取文件)。

这是一个非常愚蠢的启发式方法,但它通常对某些情况有意义。您可以做的一件事是包括用于调试版本的bluebird(如果你不是Promise,则它是100%兼容的)然后添加一个未处理的拒绝钩子:

Promise.onPossiblyUnhandledRejection(function(e, promise) {
    throw e;
});

使用更好的启发式方法。您也可以使用本机承诺(拒绝事件)执行此操作,但我不知道如何关闭同步投掷的自动中断。