打字稿承诺拒绝和 vscode 调试器行为

typescript promise rejecting and vscode debugger behavior

我正在尝试使用打字稿学习 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 reject 处停止,但在其他情况下,不会。但在所有情况下都会捕获到错误,并且没有未处理的异常。

我使用的是 vscode 特定行为还是 es6-promise 绑定?或者我做的方式不正确?有没有人遇到同样的问题?

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

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

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

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