Angular 6:使用forkJoin处理错误

时间:2018-08-23 20:09:10

标签: angular rxjs

我不确定在使用 forkJoin

时如何获取特定API调用的异常消息

我的代码编写如下

    reqs = [];
    if (shouldUpdatePhone) {
       reqs.push(this.customerService.updatePhone(phoneUpdateRequest))
    }
    if (shouldUpdateAddress) {
       reqs.push(this.customerService.updateAddress(addressUpdateRequest))
    }

    forkJoin(reqs).subscribe(result => {
       console.log('result :', result);

    }, error => {
      //How to get error message for particular api call?
});

如果一个/两个api由于某种原因失败。我应该如何确定哪个api引发异常。

2 个答案:

答案 0 :(得分:3)

您不能这样做,因为reqs = []; if (shouldUpdatePhone) { reqs.push( this.customerService.updatePhone(phoneUpdateRequest).pipe(catchError(() => { throw 'phoneUpdateError'; }); ) } if (shouldUpdateAddress) { reqs.push( this.customerService.updateAddress(phoneUpdateRequest).pipe(catchError(() => { throw 'addressUpdateError'; }); ) } 会在任何可观察对象遇到的第一个错误上引发错误。如果发出的错误中没有任何东西可以告诉您它是来自什么,例如检查错误代码,则可以选择从服务调用中创建可观察对象时处理错误。

{{1}}

现在,您可以检查抛出了哪个错误。但是,您不必通过错误处理来执行此操作;您还可以将错误映射到成功的响应并进行处理。

最终,我建议结合使用这些API调用。

答案 1 :(得分:3)

有一种使用forkJoin处理错误的方法,不会阻止您使用此运算符。关键实际上是另一个答案的一部分。

是的,forkJoin会在出现第一个错误时完成,您有点不知道它来自哪个可观察对象,但是如果您处理内部可观察对象内部的错误,就可以轻松实现。

考虑这部分代码(缩小的部分),并与@Explosion Pills answer混合在一起:

reqs: Observable<any>[] = [];
if (shouldUpdatePhone) {
  reqs.push(
    this.service.updatePhone(phone)
      .pipe(
        catchError((err) => {
          // Handle specific error for this call
          return of(undefined)),
        }
      )
  );
}
if (shouldUpdateAddress) {
      reqs.push(
        this.service.updateAddress(address)
          .pipe(
            catchError((err) => {
              // Handle specific error for this call
              return of(undefined)),
            }
          )
      );
    }

然后,针对您的forkJoin

forkJoin(reqs).subscribe(result => console.log(result));

现在考虑两个API调用都返回一个对象,分别类似于{phone: string}{address: string}。您的result将是:

[{phone: '123-456'}, {address: 'Happy Street, 123'}]

但是好吧,这是基本的forkJoin,错误处理部分在哪里?
考虑到您的一个呼叫失败,返回的错误包含一个状态代码和一条消息,并且您想同时知道它们。

正如我说的,forkJoin不会完成,如果您在内部可观察范围内处理错误,这就是为什么

  .pipe(
    catchError((err) => {
      // Handle specific error for this call
      return of(undefined)),
    }
  )

如果您的第一个电话(updatePhone)失败,则结果为

[undefined, {address: 'Happy Street, 123'}]

因为您没有让可观察对象死亡,并且在出错时返回了return of(undefined)的新可观察对象。

这使您可以处理这样的错误(在catchError内部):

catchError((err) => {
  if (err.status === 409) {
    // do something
  }
  return of(undefined)),
}

或者这样

...
catchError((err) => {
  return of({error: err, isError: true})),
}
...
forkJoin(...).subscribe(result => {
  result.forEach(r => {
    if (r.isError) {
      // do something
    }
  });
});

您所有的API调用将完成,您可以随时处理它,也可以等待所有API返回并仅处理返回错误的消息,这样您就可以获得错误可以提供给您的任何信息,并且专门处理它。