我不确定在使用 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引发异常。
答案 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返回并仅处理返回错误的消息,这样您就可以获得错误可以提供给您的任何信息,并且专门处理它。