【问题标题】:Angular : 500 error when using forkJoin to call api servicesAngular:使用 forkJoin 调用 api 服务时出现 500 错误
【发布时间】:2020-06-17 04:18:55
【问题描述】:

我在 ngOnInit 中实现了对两个 api 路由的调用以获取一些数据,我正在使用 angular 7 并实现 forkJoin 来像这样调用 api:

  ngOnInit() {
    debugger
    this.route.params.pipe(
      switchMap(params => forkJoin([
        this.http.get('/api/surveys/' + params.id),
        this.http.get('/api/surveys/getStatistics/' + params.id)
      ]))
    ).subscribe(result => {
      this.survey = result[0];
      this.statistics = result[1];
      this.updateChart(result[1]);
    }, 
      error => this.handleError(error)
    );
  }

private handleError(error) {
  debugger
  if (error.status === 400) {
    this.showError(error.error.error, 'Erreur!');
    if (error.error.error === 'Le sondage demandé n\'existe plus!') {
      this.router.navigateByUrl('/sondage');
    }
  }
}

private updateChart(statistics) {
  debugger
  statistics.options.forEach(option => {
    this.pieData.push(option.number);
    option.color = this.d3Colors[this.colorCounter];
    this.colorCounter = this.colorCounter + 1;
  });  
}

在第一个调试器之后,代码不会运行对 API 的调用请求,而是直接传递给 handleError 函数!并生成 500 服务器错误

【问题讨论】:

  • 真正的问题是什么?
  • @AndrewAllen 来自这里:stackoverflow.com/a/60526695/5367916。 OP 暗示使用 forkJoin 会生成 500 错误。
  • @KurtHamilton 暗示!= 一个问题
  • 没错。这就是我的意思...

标签: javascript angular api pipe fork-join


【解决方案1】:

500 通常是 API 服务器本身抛出的错误。如果您的设计允许,您应该将两个 API 调用分开。这样第一次通话失败不会影响第二次通话。

来自 forkJoin 规范:“如果在某些时候有任何输入 observable 错误,forkJoin 也会出错,并且所有其他 observable 将立即取消订阅。”

因此,一个调用失败会使其他 API 调用成功无关紧要,因为 observable 已经取消订阅。

【讨论】:

  • 说他们“应该”将电话分开是可疑的。为什么 OP 会将不需要的数据调用到视图中?如果视图需要所有数据,则整个视图应该会失败并且不会呈现部分视图。如果视图可以单独存在,那么它们应该是调用它们所需数据的单独视图。但一般的最佳实践是在一个流中调用所有视图数据,并使其作为一个单元失败或成功
  • 另外,如果需要单独的错误处理,那么每个单独的请求都可以在自己的管道中拥有自己的catchError
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多