Angular2- Confundindo-se com o escopo de fechamento do Observable Catch
Querendo saber se você pode dar um pouco de assistência. Parece que estou ficando um pouco confuso quando se trata de usarcatch
comObservable
s.
Basicamente, o que estou tentando fazer é o seguinte: Quando minha API retorna um erro 403, desejo executar algumas ações no meuTokenStore
, ou seja, exclua o token local e marque o usuário como não autenticado. A maneira como estou tentando fazer isso pode estar errada, por favor, deixe-me saber se há uma maneira melhor de fazer isso.
Estou tentando fazer isso com o seguinte código:
APIConnector.service.ts - um serviço único para métodos de comunicação 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') });
}
}
Em cada um dos meus serviços que usam o APIConnector, tenho métodos de captura noObservable
s, para executar ohandleError
fecho. por exemplo.
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);
}
No entanto, isso fornece o seguinte erro:
EXCEÇÃO: TypeError: Não é possível ler a propriedade 'destroy' de undefined
Presumivelmente, isso ocorre porque handleError é um fechamento. Não tenho certeza da melhor maneira de lidar com isso, no entanto.
Qualquer pensamento seria muito apreciado