【问题标题】:VS Code Promise catch handler is not called未调用 VS Code Promise 捕获处理程序
【发布时间】:2018-02-05 20:44:38
【问题描述】:

我正在用 Visual Studio Code 编写一个 react + typescript 应用程序:

react.js:16.2.0 打字稿:2.6.2

我正在使用 vscode 的内置 Promise 库。但不知何故,我无法将被拒绝的承诺传播给调用者函数。在这里,我想尽可能地简化我的代码(它已经是一个复杂的应用程序)。

假设我有一个返回承诺的内部函数 Foo:

const Foo = (args) => {

    return new Promise( (resolve, reject) => {

         // 1. call a remote backend method (e.g ajax)
         // 2. on call success:
               resolve(success);

         // 3. on call fails:
               reject(error); // --> this error does not propagate
    }); 
}

现在这里是调用 Foo 的外部函数 Bar:

const Bar = (args) => {

    new Promise( (resolve, reject) => {

         Foo(args).then( success => {

            //...success code

         }).catch(error => {
            // ! this handle is never called
         }); 
    }) 
}

在外部函数 Bar 上,从不调用 catch 处理程序!就像内心的承诺拒绝无声无息地失败了。我发誓这一直有效到昨天......我花了我周日的一半时间试图弄清楚这是怎么回事。

我不知道该怎么办了。所以我求助于 Stackoverflow 和社区。关于将 Promise 与 Typescript 一起使用,我有什么遗漏吗? (在我使用 Q.js 库之前。但我切换到了 Vscode 附带的嵌入式承诺库)。任何帮助都会真正帮助我。

【问题讨论】:

  • 您是否尝试在// 3. on call fails: 块上放置console.log() 以查看是否实际调用了reject 函数?
  • 实际调用了reject函数。我在这条线上设置了一个断点。它实际上停在那里。
  • 我省略的一件事(正如我所说,我试图总结我的示例代码)是内部函数 Foo 使用 q.js 承诺库。我认为这与 vscode 内置的 Promise 库有冲突
  • 你尝试过更改 promise 库吗?
  • 不幸的是,我无法更改承诺库。内部的 foo 是使用 q.js 的第三方库,而我的应用程序使用的是 vscode 内置的 promise 库。这一直工作到最近。前几天,我将vscode升级到1.19.3版本。如果这次升级破坏了我的代码,我会徘徊

标签: reactjs typescript promise


【解决方案1】:

在外部函数 Bar 上,从不调用 catch 处理程序!就像内心的承诺拒绝无声无息地失败了。我发誓这一直工作到昨天......我花了我周日的一半时间试图弄清楚这是怎么回事。

如果reject 被调用之后 resolve 已被调用,则承诺不会拒绝,因为它已被确定为已履行。因此不会调用catch 处理程序。

【讨论】:

  • 我认为对于 cmets,他的意思是使用了某种“if”语句,我认为这不是问题
  • 感谢您的回答。但是由于远程调用失败,因此未调用解析。所以只有拒绝被调用
【解决方案2】:

可以将可选的第二个函数传递给.then() 以处理拒绝。

const Bar = (args) => {

    new Promise( (resolve, reject) => {

         Foo(args).then( success => {

            //...success code

         }, error => {
            //...handle error
         }) 
    }) 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2019-03-10
    • 1970-01-01
    • 2016-11-06
    • 2014-09-02
    • 2018-06-14
    • 2011-09-16
    相关资源
    最近更新 更多