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 Observables.

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 Observables, 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é

Que faire si vous ne .catch(error => this._apiConnector.handleError(error)) ?

OriginalL'auteur user43138 | 2016-03-25