Angular2: confundirse con el alcance de cierre de captura observable
Preguntándome si puedes dar un poco de ayuda. Parece que me estoy confundiendo un poco cuando se trata de usarcatch
conObservable
s.
Básicamente, lo que intento hacer es lo siguiente: cuando mi API devuelve un error 403, quiero realizar algunas acciones en miTokenStore
, es decir, eliminar el token local y marcar al usuario como no autenticado. La forma en que trato de hacer esto puede ser incorrecta, así que avíseme si hay una mejor manera de lograrlo.
Estoy tratando de lograr esto con el siguiente código:
APIConnector.service.ts - un servicio único para métodos de comunicación API
import {Injectable} from 'angular2/core';
import {Http, Response, Headers, RequestOptions} from 'angular2/http';
import {Observable} from 'rxjs/Observable';
import * as _ from 'lodash';
import {Logger} from './logger.service';
import {TokenStore} from '../stores/token.store';
@Injectable()
export class APIConnector {
private _apiUrl:string = 'https://api.sb.zerojargon.com/';
private _token:string = null;
constructor(
private _http:Http,
private _logger:Logger,
private _tokenStore:TokenStore
) {}
get(endpoint:String, includes:Array<string>) {
let includeString = (!_.isUndefined(includes)) ? this._parseIncludes(includes) : '';
let headers = this._createHeaders();
let options = new RequestOptions({ headers: headers });
return this._http.get(this._apiUrl + endpoint + '?include=' + includeString, options);
}
post(endpoint:String, formData:Object, includes:Array<string>) {
let includeString = (!_.isUndefined(includes)) ? this._parseIncludes(includes) : '';
let body = JSON.stringify(formData);
let headers = this._createHeaders();
let options = new RequestOptions({ headers: headers });
return this._http.post(this._apiUrl + endpoint + '?include=' + includeString, body, options);
}
handleError(error: Response) {
// log out the user if we get a 401 message
if (error.json().error.http_code === 401) {
this._tokenStore.destroy();
}
return Observable.throw(error.json().error || 'Server error');
}
private _parseIncludes(includes:Array<String>) {
return includes.join();
}
private _createHeaders() {
return new Headers({ 'Content-Type': 'application/json', 'Authorization': 'bearer ' + localStorage.getItem('token') });
}
}
En cada uno de mis servicios que usan APIConnector, tengo métodos catch en elObservable
s, para ejecutar elhandleError
cierre. p.ej.
public createEvent(event:Object) {
let endpoint = this._endpoint;
return this._apiConnector.post('clients/'+this.client+'/events', event, this._defaultIncludes)
.map(res => {
return this._transformer.map('event', <Object[]>res.json());
})
.catch(this._apiConnector.handleError);
}
Sin embargo, esto da el siguiente error:
EXCEPCIÓN: TypeError: no se puede leer la propiedad 'destruir' de indefinido
Presumiblemente esto se debe a que handleError es un cierre. Sin embargo, no estoy seguro de la mejor manera de lidiar con esto.
Cualquier idea sería muy apreciada