【问题标题】:How can I continue to call API after get error when using rxjs concat?使用rxjs concat时出现错误后如何继续调用API?
【发布时间】:2019-12-09 18:09:20
【问题描述】:

我正在使用concat顺序调用多个API,但是当出错时,concat停止调用api,那么如何得到错误并继续调用下一个API,这是我的代码:

getData() {
    concat(...this.data.map(asset =>
      this.assetService.requestData({ assetId: asset._id })
    ))
      .pipe(catchError(error => {
        console.log(error);
        // return of(null);
        this.error = error;
        return throwError(error);
      }))
      .subscribe();

  }

【问题讨论】:

  • 你可以尝试在pipe()函数被调用之前添加.retry(N)
  • @akkonrad 但我想尝试 5 次后如果仍然出错,我可以继续获取另一个 api

标签: angular rxjs6


【解决方案1】:

错误捕获应该针对每个 observable 单独发生。你可以简单地返回一个空的 observable:

import { EMPTY } from 'rxjs';

concat(...this.data.map(asset =>
  this.assetService.requestData({assetId: asset._id})
    .pipe(catchError(error => {
      console.log(error);
      this.error = error;
      return EMPTY;
    }))
  ))
  .pipe(filter(data => !!data)) // add this line if you do not want to see nulls in result
  .subscribe();


另一种选择是使用onErrorResumeNext 函数:

import { onErrorResumeNext } from 'rxjs';

onErrorResumeNext(...this.data.map(asset => 
  this.assetService.requestData({assetId: asset._id})
)
.subscribe();

【讨论】:

  • 第二种方法适用于我,但如果使用 onErrorResumeNext 时如何获取错误?我尝试添加管道,但没有成功
猜你喜欢
  • 2018-11-30
  • 2014-09-11
  • 2019-01-11
  • 2020-02-05
  • 2018-10-12
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多