2016-03-25 14 views
14

के साथ भ्रमित हो रहा है यदि आप थोड़ा सहायता दे सकते हैं तो आश्चर्य की बात है। एस के साथ catch का उपयोग करने की बात आती है जब मैं खुद को थोड़ा उलझन में लग रहा हूं।कोणीय 2- पर्यवेक्षण कैच क्लोजर स्कोप

असल में मुझे क्या करना कोशिश कर रहा हूँ है निम्नलिखित: मेरी एपीआई एक 403 त्रुटि देता है, मैं, मेरी TokenStore पर कुछ कार्रवाई करने के लिए अर्थात् स्थानीय टोकन हटा सकते हैं और अप्रमाणित के रूप में उपयोगकर्ता को चिह्नित करना चाहते हैं। जिस तरह से मैं ऐसा करने की कोशिश कर रहा हूं वह गलत हो सकता है, इसलिए अगर इसे पूरा करने का एक बेहतर तरीका है तो कृपया मुझे बताएं।

मैं निम्नलिखित कोड के साथ यह पूरा करने के कोशिश कर रहा हूँ:

APIConnector.service.ts - एपीआई संचार तरीकों के लिए एक एकल सेवा

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') }); 
    } 
} 

जो का उपयोग अपनी सेवाओं में से प्रत्येक में एपीआईसीनेक्टर, handleError बंद करने के लिए, Observable एस पर मेरे पास कैच विधियां हैं। जैसे

EXCEPTION: TypeError: Cannot read property 'destroy' of undefined

मुमकिन है इस वजह से handleError एक बंद है:

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); 
} 

बहरहाल, यह निम्न त्रुटि देता है। हालांकि, इस से निपटने का सबसे अच्छा तरीका मुझे यकीन नहीं है।

किसी भी विचार बहुत सराहना की जाएगी

+2

तुम क्या करता है, तो '.catch (त्रुटि => this._apiConnector.handleError (त्रुटि)) ' – Abdulrahman

उत्तर

21

समस्या आप समारोह संदर्भ सीधे ताकि आप उसके संदर्भ खोना है। मेरा मतलब है कि अब यह कार्य और एक विधि है।

  • यह करने के लिए समारोह बाध्यकारी:

    .catch(this._apiConnector.handleError.bind(this)); 
    

    यह दृष्टिकोण अनुशंसित नहीं है क्योंकि आप प्रकार यहाँ खो देंगे

    वहाँ दो इसे ठीक करने के तरीके हैं। https://basarat.gitbooks.io/typescript/content/docs/tips/bind.html

  • एक तीर समारोह में कॉल लपेटकर: अधिक जानकारी के लिए इस लिंक को देख

    .catch((error) => { 
        this._apiConnector.handleError(error); 
    }); 
    
+4

यह उत्तर एक छोटा समायोजन के साथ सही था। कैच विधि के लिए आपको कुछ वापस करने की आवश्यकता होती है, इसलिए ब्रैकेट के भीतर 'वापसी' की आवश्यकता होती है। – user43138

+2

यदि आप एक नई या एक ही त्रुटि फेंकना चाहते हैं तो आप कुछ वापस लौटते हैं: "अवलोकनयोग्य। थ्रो (त्रुटि);"। यदि यह आपका मामला नहीं है, तो वापस मत आना। त्रुटि किसी अन्य पकड़ या सब्सक्राइब की दूसरी कॉलबैक पर प्रचारित नहीं की जाएगी। –

+2

मुझे एक ही समस्या थी और इस जवाब ने इसे हल किया। हालांकि मुझे ब्रैकेट के बिना समाधान और '_apiConnector' तरीके से बेहतर '.catch (error => this.handle त्रुटि (त्रुटि)) के बिना समाधान पसंद है; ' – hogan

संबंधित मुद्दे