VS Code Promise catch处理程序未调用

时间:2018-02-04 23:04:07

标签: reactjs typescript promise

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

enter image description here

react.js:16.2.0 打字稿:2.6.2

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

假设我有一个内部函数Foo,它返回一个promise:

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
         }); 
    }) 
}

在外部函数栏上,永远不会调用catch处理程序!这就像内心的承诺拒绝无声地失败。我发誓,这一直工作到昨天......我已经花了一半的时间试图弄清楚是不是正在进行。

我不知道该怎么办。所以我转向Stackoverflow和社区。在使用带有Typescript的Promise时,我有什么遗漏吗? (在我使用Q.js库之前。但我切换到Vscode附带的嵌入式promise库)。任何帮助都会对我有所帮助。

2 个答案:

答案 0 :(得分:1)

  

在外部函数栏上,永远不会调用catch处理程序!这就像内心的承诺拒绝无声地失败。我发誓,这一直工作到昨天......我已经花了一半的时间试图弄清楚是不是正在进行。

如果在调用 reject之后调用{em> ,那么承诺不会拒绝,因为它已在履行时结算。因此不会调用resolve个处理程序。

答案 1 :(得分:0)

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

const Bar = (args) => {

    new Promise( (resolve, reject) => {

         Foo(args).then( success => {

            //...success code

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