链接HTTP承诺时如何调用catch方法?

时间:2017-10-03 11:24:48

标签: angular http typescript promise

我为Angular应用程序创建了一个自定义loaderService,它在后端处理请求(或一组请求)时提供加载微调器。这是我的代码:

catch

我在请求之前显示微调器,但我想确保无论请求成功还是失败都关闭它。这就是为什么我在底部放置then和最终method2()的原因。代码工作正常,但是当我调试它时,我意识到即使第二个请求(带有故意拼写错误的单词)失败,method2()仍然被调用。或者它真的失败了吗?

我的问题是,在链接请求时catch方法如何工作。我想如果请求失败,我们会直接使用catch方法,但我可能错了。

编辑:原来我错误地调用了{{1}}。见T.J.克劳德的答案更多。

2 个答案:

答案 0 :(得分:3)

  

...我意识到即使第二个请求(故意拼写错误的单词)失败,method2()仍然被调用...

我怀疑你误解了你在调试器中看到的内容,在这种情况下很容易做到。

在此代码中:

method() {
  this.loaderService.display(true);
  this.orderService.firstRequest()
    // the misspelled word causes a 500 error
    .then((response) => this.orderService.methodWithWrongInput('misspelled_word'))
    // but it still executes the following then
    .then(() => this.method2())
    .catch(() => null)
    .then(() => this.loaderService.display(false));
}

以下是发生的事情:

  1. this.loaderService.display(true);运行
  2. this.orderService.firstRequest()运行并返回一个承诺
  3. .then((response) => this.orderService.methodWithWrongInput('misspelled_word'))运行 - 回调中的部分,只有then。它在promise上注册了一个解析处理程序并返回一个新的promise。
  4. .then(() => this.method2())再次运行,只是then调用,而不是其回调。它又回来了另一个新的承诺。
  5. .catch(() => null)再次运行,只是catch调用,而不是其回调。它又回来了另一个新的承诺。
  6. .then(() => this.loaderService.display(false))再次运行,只是then调用,而不是其回调。它又回来了另一个新的承诺。
  7. 然后稍后,来自firstRequest()的承诺会解决,

    1. (response) => this.orderService.methodWithWrongInput('misspelled_word')运行并返回新的承诺
    2. 然后稍后,该承诺拒绝,

      1. () => null(在您的catch处理程序中)运行并返回null,它会解析相关的承诺(例如,将拒绝转换为解决方案)
      2. () => this.loaderService.display(false)运行,因为此时链已解决(未被拒绝)(感谢上面的#8)
      3. 因此,在调试器中,在上面的初始序列(#4)中,您将看到执行光标跨过then method2 method2调用,其中链正在同步建立;但这只是将处理程序添加到链中。您不会看到methodWithWrongInput实际上被调用,因为当解决/拒绝发生时(在{{1}}拒绝的情况下)

        ,该回调永远不会被触发

答案 1 :(得分:-2)

本文详细解释了承诺:MDN Promises 如果你想做一个' final' catch,您可能想要使用Promise.all(\[promise1, promise2, ..., promiseN\].catch();