如何在 RxJS 5.5 中捕获错误
How to catch error in RxJS 5.5
我正在使用 Angular 5
和 RXJS 5.5
之前我只能做这样的事情
getProjectInfo(id): Observable<any> {
const URL = `${this.API}/${id}`;
return this.http.get(URL)
.pipe(map(res => res)),
catchError(this.handleServerError);
}
handleServerError(error: any) {
console.log(error.error || error.json() || error);
return Observable.throw(error.error || error.json() || error || 'Server error');
}
但现在我得到这个错误
Error:(21, 5) TS2322:Type 'UnaryFunction<Observable<{}>, Observable<any>>' is not assignable to type 'Observable<any>'.
Property '_isScalar' is missing in type 'UnaryFunction<Observable<{}>, Observable<any>>'.
我也试过这个
getProjectInfo(id): Observable<any> {
const URL = `${this.API}/${id}`;
return this.http.get(URL)
.pipe(map(res => res)),
catchError(err => this.handleError('getProjInfo', URL));
}
private handleError(method: String, URL: string): any {
return (err: any) => {
const errMsg = `error in ${method}() retrieving ${URL}`;
console.log(`${errMsg}:`, err);
if (err instanceof HttpErrorResponse) {
console.log(`status: ${err.status}, ${err.statusText}`);
}
return Observable.throw(errMsg);
};
}
我做错了什么?
你的管道不正确。请更改为:
getProjectInfo(id): Observable<any> {
const URL = `${this.API}/${id}`;
return this.http.get(URL)
.pipe(map(res => res)
.catch(err => this.handleError('getProjInfo', URL)));
}
正如马丁所说,它应该在管道内。
记住你的括号。你 return pipe
结果和 catchEror
结果除以 ,
:
return this.http.get(URL)
.pipe(map(res => res)),
catchError(this.handleServerError);
将一个括号放在自己的位置:
return this.http.get(URL)
.pipe(
map(res => res),
catchError(this.handleServerError)
);
我认为您接受的答案不正确。
使用管道语法,我想应该是这样的:
return this.http.get(URL)
.pipe(
map(res => doStuff(res)),
catchError(err => {
this.handleServerError(err);
return this.resDummyData;
})
);
使用 catchError 运算符时,您需要 return 使用订阅期望格式的数据再次观察。否则,如果您在下游订阅中的逻辑因缺少实际的 http 响应数据而失败,那么捕获错误将无济于事...
或者,您可能想要使用其他 rxjs 运算符,例如 retry 或 retryWhen,而不是 catchError,具体取决于您的用例。
我正在使用 Angular 5
和 RXJS 5.5
之前我只能做这样的事情
getProjectInfo(id): Observable<any> {
const URL = `${this.API}/${id}`;
return this.http.get(URL)
.pipe(map(res => res)),
catchError(this.handleServerError);
}
handleServerError(error: any) {
console.log(error.error || error.json() || error);
return Observable.throw(error.error || error.json() || error || 'Server error');
}
但现在我得到这个错误
Error:(21, 5) TS2322:Type 'UnaryFunction<Observable<{}>, Observable<any>>' is not assignable to type 'Observable<any>'.
Property '_isScalar' is missing in type 'UnaryFunction<Observable<{}>, Observable<any>>'.
我也试过这个
getProjectInfo(id): Observable<any> {
const URL = `${this.API}/${id}`;
return this.http.get(URL)
.pipe(map(res => res)),
catchError(err => this.handleError('getProjInfo', URL));
}
private handleError(method: String, URL: string): any {
return (err: any) => {
const errMsg = `error in ${method}() retrieving ${URL}`;
console.log(`${errMsg}:`, err);
if (err instanceof HttpErrorResponse) {
console.log(`status: ${err.status}, ${err.statusText}`);
}
return Observable.throw(errMsg);
};
}
我做错了什么?
你的管道不正确。请更改为:
getProjectInfo(id): Observable<any> {
const URL = `${this.API}/${id}`;
return this.http.get(URL)
.pipe(map(res => res)
.catch(err => this.handleError('getProjInfo', URL)));
}
正如马丁所说,它应该在管道内。
记住你的括号。你 return pipe
结果和 catchEror
结果除以 ,
:
return this.http.get(URL)
.pipe(map(res => res)),
catchError(this.handleServerError);
将一个括号放在自己的位置:
return this.http.get(URL)
.pipe(
map(res => res),
catchError(this.handleServerError)
);
我认为您接受的答案不正确。
使用管道语法,我想应该是这样的:
return this.http.get(URL)
.pipe(
map(res => doStuff(res)),
catchError(err => {
this.handleServerError(err);
return this.resDummyData;
})
);
使用 catchError 运算符时,您需要 return 使用订阅期望格式的数据再次观察。否则,如果您在下游订阅中的逻辑因缺少实际的 http 响应数据而失败,那么捕获错误将无济于事...
或者,您可能想要使用其他 rxjs 运算符,例如 retry 或 retryWhen,而不是 catchError,具体取决于您的用例。