问题描述
在允许子类订阅
到Angular2中的observable之前,基类是否有可能catch
某些错误.
Is it possible for a base class to catch
certain errors before allowing the subclass to subscribe
to the observable in Angular2.
例如
export class SomeBaseClass {
constructor(private _http: Http, private _location: Location) {}
protected _fetchData(url): Observable<any> {
const headers = new Headers();
headers.append('Authorization', 'Token foo');
return this._http.get(url, {headers})
.map(response => response.json())
.catch(response => this._handle401(error));
}
private _handle401(response: Response) {
if(response.status === 401) {
this._location.go('/login');
}
// What should this return?
}
}
export class SomeClass extends SomeBaseClass {
constructor( _http: Http, _location: Location) {
super(_http, _location);
}
doTheThing() {
this._fetchData('/someUrl')
.subscribe(
response => this._handleResponse(response),
error => this._handleErrorThatIsNot401(error));
}
private _handleResponse(response) {
// ...
}
private _handleErrorThatIsNot401(error) {
// ...
}
}
catch
是我要找的吗?我应该使用 map
(或其他)吗?还是我完全以错误的方式处理这个问题?
Is catch
what I am looking for? Should I be using map
(or something else)? Or am I going about this the wrong way entirely?
这两个答案(到目前为止)都让我走上了正确的道路,最终 - 我是这样解决的:
Both answers (so far) put me on the right track, ultimately - I solved it like this:
protected _get(url: string, data?: any): Observable<any> {
return super._get(url, data, this._authorizationHeader)
.map(response => response.json())
.catch(response => this._handle401(response));
}
private _handle401(response: Response): Observable<any> {
try {
if(response.status === 401) {
this._router.navigateByUrl('/login');
return Observable.throw(response.status);
}
} catch(err) {
console.warn('AuthenticatedHttpService._handle401');
console.error(err);
}
return Observable.of(response);
}
推荐答案
.catch()
是正确的方案.
Observable
是懒惰的,所以在订阅之前没有错误.不确定你的意思是不是这种之前",所以我提到它只是为了确定.
Observable
is lazy, so there are no errors before you subscribe. Not sure if you mean this kind of "before" therefore I mention it just to be sure.
这篇关于我可以在“subscribe()"之前捕获某些错误吗?在 Angular2 中可观察的 RXJS 中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!