Angular2 - de Se confondre avec l'Observable Attraper la fermeture de la portée
Vous vous demandez si vous pouvez donner un peu d'aide. Il vous semble que je devenais un peu confus quand il s'agit de l'aide catch
avec Observable
s.
Fondamentalement, ce que je suis en train de faire est la suivante:
Lors de mon API renvoie une erreur 403, je veux effectuer certaines actions sur mon TokenStore
, à savoir, supprimer le local jeton et marquer l'utilisateur non authentifié. La façon dont je suis en train de faire ce qui peut être mauvais, donc s'il vous plaît laissez-moi savoir si il ya une meilleure façon d'accomplir ceci.
Je suis en train de réaliser cela avec le code suivant:
APIConnector.service.ts - un service unique pour la communication de l'API méthodes
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') });
}
}
Dans chacun de mes services qui utilisent le APIConnector, j'ai attraper des méthodes sur le Observable
s, pour exécuter le handleError
fermeture. par exemple,
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);
}
Cependant, cela donne l'erreur suivante:
EXCEPTION: TypeError: Cannot read property 'détruire' undefined
Sans doute c'est parce que handleError est une fermeture. Je ne suis pas sûr de la meilleure façon de faire face à cela, cependant.
Toute pensée serait grandement apprécié
.catch(error => this._apiConnector.handleError(error))
?OriginalL'auteur user43138 | 2016-03-25
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous faites référence à la fonction directement de sorte que vous perdre de son contexte. Je veux dire, c'est maintenant afunction et une méthode.
Il y a deux façons de résoudre ce problème:
de liaison de la fonction:
Cette approche n'est pas recommandée, car vous perdrez des types ici. Voir ce lien pour plus de détails: https://basarat.gitbooks.io/typescript/content/docs/tips/bind.html
habillage de l'appel en flèche de la fonction:
return
est requis à l'intérieur des parenthèses.Vous retourner quelque chose si vous voulez jeter un nouveau ou le même message d'erreur: "retour Observables.jeter(erreur);". Si ce n'est pas votre cas, ne reviennent pas. L'erreur ne sera pas propagée à l'autre attraper ou à la deuxième rappel de abonnez-vous.
J'ai eu le même problème et cette réponse résolu. Cependant j'aime la solution sans parenthèses et sans '_apiConnector façon de mieux
.catch(error => this.handleError(error));
OriginalL'auteur Thierry Templier