我为Angular应用程序创建了一个自定义loaderService,它在后端处理请求(或一组请求)时提供加载微调器。这是我的代码:
catch
我在请求之前显示微调器,但我想确保无论请求成功还是失败都关闭它。这就是为什么我在底部放置then
和最终method2()
的原因。代码工作正常,但是当我调试它时,我意识到即使第二个请求(带有故意拼写错误的单词)失败,method2()
仍然被调用。或者它真的失败了吗?
我的问题是,在链接请求时catch方法如何工作。我想如果请求失败,我们会直接使用catch方法,但我可能错了。
编辑:原来我错误地调用了{{1}}。见T.J.克劳德的答案更多。
答案 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));
}
以下是发生的事情:
this.loaderService.display(true);
运行this.orderService.firstRequest()
运行并返回一个承诺.then((response) => this.orderService.methodWithWrongInput('misspelled_word'))
运行 - 不回调中的部分,只有then
。它在promise上注册了一个解析处理程序并返回一个新的promise。.then(() => this.method2())
再次运行,只是then
调用,而不是其回调。它又回来了另一个新的承诺。.catch(() => null)
再次运行,只是catch
调用,而不是其回调。它又回来了另一个新的承诺。.then(() => this.loaderService.display(false))
再次运行,只是then
调用,而不是其回调。它又回来了另一个新的承诺。然后稍后,来自firstRequest()
的承诺会解决,
(response) => this.orderService.methodWithWrongInput('misspelled_word')
运行并返回新的承诺然后稍后,该承诺拒绝,
() => null
(在您的catch
处理程序中)运行并返回null
,它会解析相关的承诺(例如,将拒绝转换为解决方案)() => this.loaderService.display(false)
运行,因为此时链已解决(未被拒绝)(感谢上面的#8)因此,在调试器中,在上面的初始序列(#4)中,您将看到执行光标跨过then
method2
method2
调用,其中链正在同步建立;但这只是将处理程序添加到链中。您不会看到methodWithWrongInput
实际上被调用,因为当解决/拒绝发生时(在{{1}}拒绝的情况下)
答案 1 :(得分:-2)
本文详细解释了承诺:MDN Promises
如果你想做一个' final' catch,您可能想要使用Promise.all(\[promise1, promise2, ..., promiseN\].catch();