【问题标题】:Angular chaining Http requests catch only on first oneAngular 链接 Http 请求仅捕获第一个
【发布时间】:2020-11-03 01:05:41
【问题描述】:

我正在链接 Angular Http 请求,如下所示。问题是当第一个请求失败时,我会在错误回调中得到它,但如果第二个请求失败,则什么也不会发生。

this.myService.requestOne(this.data)
.pipe(mergeMap(dataOne=>{
  return this.myService.requestTwo(dataOne);
}))
.subscribe(dataTwo=>{
  this.loading = false;
},
(err)=>{
  // this fires when only requestOne get failed
  this.loading = false;
});

有什么想法吗?

【问题讨论】:

  • 因为requestTwo没有订阅者。
  • 那么,应该怎么回答呢?
  • 尝试做这样的事情this.myService.requestTwo(dataOne).pipe(catchError(err => throwError(err))),此时你正在传播错误抛出管道
  • 这看起来应该可以工作,我认为问题不在于您的流。你确定 requestTwo 失败了吗?

标签: angular rxjs angular-httpclient


【解决方案1】:

这还不是您问题的真正答案,因为您正在做的事情应该有效。这是一些建议,可以帮助您调试正在发生的事情。在这里,我将用新错误和自定义消息替换您收到的任何错误(来自任一流)。如果抛出错误,它将被打印到控制台。

this.myService.requestOne(this.data).pipe(
  catchError(err => throwError(new Error("Request One Error"))),
  mergeMap(dataOne => 
    this.myService.requestTwo(dataOne).pipe(
      catchError(err => throwError(new Error("Request Two Error")))
    )
  )
).subscribe({
  next: _ => console.log("Stream Emission"),
  complete: () => console.log("Stream Completed"),
  error: err => console.log(err.message)
});

如果您没有收到"Request Two Error",这意味着requestTwo 没有抛出错误,您的问题出在其他地方。如果你得到"Stream Completed",那么你的代码运行没有抛出错误。

【讨论】:

  • 什么不起作用?发生了什么或没有发生什么?控制台打印了什么?预期的行为是什么?你怎么知道requestTwo 失败了?你试过什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多