在RxJS中,catch
和catchError
是用于处理Observable中的错误的操作符。它们的区别如下:
catch
操作符:在RxJS v5及以下版本中使用,用于捕获Observable中的错误,并返回一个新的Observable。它可以捕获同步和异步的错误,并将其转换为一个新的Observable,使得后续的操作符可以继续处理数据流。使用catch
时,需要传入一个回调函数,该函数会接收到错误对象,并返回一个新的Observable。示例代码:
import { Observable } from 'rxjs';
const source$ = new Observable(observer => {
observer.next('A');
observer.next('B');
throw new Error('Error occurred');
});
const result$ = source$.catch(error => {
console.log('Caught error:', error.message);
return Observable.of('C');
});
result$.subscribe(value => console.log(value));
输出结果:
A
B
Caught error: Error occurred
C
catchError
操作符:在RxJS v6及以上版本中使用,用于捕获Observable中的错误,并返回一个新的Observable。它与catch
操作符的功能相同,但使用方式略有不同。catchError
是一个管道操作符,需要在管道中使用,而不是在Observable上直接调用。它接收一个回调函数,该函数会接收到错误对象,并返回一个新的Observable。示例代码:
import { of } from 'rxjs';
import { catchError } from 'rxjs/operators';
const source$ = of('A', 'B').pipe(
catchError(error => {
console.log('Caught error:', error.message);
return of('C');
})
);
source$.subscribe(value => console.log(value));
输出结果:
A
B
Caught error: Error occurred
C
对于API调用返回的网络错误,可以使用catchError
操作符来处理。在回调函数中,可以根据错误类型进行相应的处理,例如重新发起请求、返回默认值或者抛出自定义错误等。以下是一个处理API调用返回的网络错误的示例代码:
import { of } from 'rxjs';
import { catchError } from 'rxjs/operators';
function makeAPICall(): Observable<any> {
// 假设这里是一个发起API调用的函数
// 返回一个Observable,表示API的响应
return apiCall();
}
makeAPICall().pipe(
catchError(error => {
if (error.status === 404) {
console.log('API not found');
return of({ data: null });
} else {
console.log('Network error occurred');
throw new Error('Network error');
}
})
).subscribe(response => {
if (response.data) {
console.log('API response:', response.data);
} else {
console.log('API not found');
}
});
在上述代码中,如果API调用返回404错误,会打印"API not found"并返回一个包含data: null
的Observable。如果是其他网络错误,会打印"Network error occurred"并抛出一个自定义的错误。
领取专属 10元无门槛券
手把手带您无忧上云