执行后,Angular Rxjs通过forkJoin从Observables数组中获取错误

时间:2019-05-01 17:53:54

标签: angular typescript rxjs

我通过forloop构建了一系列可观察对象。然后,我使用forkjoin按顺序执行它们,并在全部通过.add()完成后刷新视图。

    let observables: Observable<any>[] = [];
    this.selection.selected.forEach((person) => {
      // API CALL.
      observables.push(this._personService.deletePerson(person.ID));
    });

    forkJoin(observables)
      .pipe(take(1))
      .subscribe(dataArray => {})
      .add(() => {
        this._snackbars.openSnackbarShowResults("Mass Delete Completed.");
        this.refresh();
    });

我需要一种方法来跟踪哪些可观察的对象失败并返回错误。我使用这些错误来通知用户哪些对象无法删除,哪些对象可以删除。在forkJoin完成之后,是否有一种简单的方法来获取哪些可观察对象出错?

基本上是forkJoin中失败已完成可观察对象的列表。

2 个答案:

答案 0 :(得分:1)

您可以在要插入数组的可观察对象上放置一个catch块。这样,您可以确定输出失败时必须是什么。尝试下面的代码片段,并验证您的控制台日志:

let observables: Observable<any>[] = [];
this.selection.selected.forEach((person) => {
  // API CALL.
  observables.push(this._personService.deletePerson(person.ID).catch(() => Observable.of(false)));
});

forkJoin(observables)
  .pipe(take(1))
  .subscribe(dataArray => { console.log(JSON.stringify(dataArray)); })
  .add(() => {
    this._snackbars.openSnackbarShowResults("Mass Delete Completed.");
    this.refresh();
});

答案 1 :(得分:1)

使用rxjs的更好方法是通过管道传递catchError运算符,该运算符会将错误消息存储在一个对象中,以便以后使用。处理完错误后,您可以传递可观察到的null

.pipe(
    catchError(err => {
        this.errors["errorForObservable1"] = "error";
        return of(null);
    })
)

https://stackblitz.com/edit/angular-forkjoin-handle-errors上的Stackblitz