【问题标题】:typescript promise rejecting and vscode debugger behavior打字稿承诺拒绝和 vscode 调试器行为
【发布时间】:2016-12-28 01:05:41
【问题描述】:

我正在尝试使用 typescript 学习 Promise,但我遇到了一些问题,了解导致这种 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 拒绝处停止,但在另一种情况下则不会。但在所有情况下都会捕获错误,并且不会出现未处理的异常。

是我使用的 vscode 特定行为还是 es6-promise 绑定?还是我做错了?有没有人遇到过同样的问题?

【问题讨论】:

  • 看起来确实是调试器中的一个错误。或者它只是将reject 调用视为throws,默认情况下它可能会停止。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我发现使用const Promise = require('bluebird'); 可以解决我的问题。我猜 Bluebird 比原生 Promises 更灵活,并且不在乎你是否使用同步拒绝。
猜你喜欢
  • 2018-12-19
  • 2019-08-28
  • 2021-03-14
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 2015-11-16
相关资源
最近更新 更多