我有一个网络呼叫,api可能会抛出400错误。我想优雅地处理这个问题。
现在,我像下面这样-
private fetchStatus(objectId: string): Observable<string> {
return Observable.create((observer) => {
this.http.get('/api/data-one').subscribe(response => {
if (response.result === 'SUCCESS') {
observer.next('SUCCESS');
} else {
observer.next('DENIED');
}
observer.complete();
},
error => {
observer.next('DENIED');
observer.complete();
});
});
}
但是我更喜欢使用Observable.map运算符。 Observable.map的问题是,当api抛出400时,整个observable进入错误模式。
我想避免这种情况,因为在与其他调用的forkJoin中使用了此get调用。失败将意味着整个forkJoin失败
forkJoin([
this.http.get('/api/route-2'),
this.http.get('/api/route-1'),
this.fetchStatus('abc')
]).subscribe((responseCollection: any) => {
observer.next({
result1: responseCollection[0],
result2: responseCollection[1],
result3: responseCollection[2]
});
observer.complete();
}, error => observer.error(error));
答案 0 :(得分:2)
您可以使用map和catchError来做到这一点。
catchError
将捕获源抛出的任何错误并返回一个新的Observable。对于您的情况,此新的Observable会在HTTP错误的情况下传递给forkJoin
。
private fetchStatus(objectId: string): Observable<string> {
return this.http.get('/api/data-one').pipe(
map(response => response.result === 'SUCCESS' ? 'SUCCESS' : 'DENIED'),
catchError(error => of('DENIED')),
);
}