2016-05-13 18 views
5

मैं कोणीय 2 और पर्यवेक्षकों के लिए नया हूं इसलिए यदि मेरी समस्या तुच्छ है तो मैं क्षमा चाहता हूं। वैसे भी मैं आरएक्सजेएस का उपयोग कर कोणीय 2 HTTP क्लाइंट का परीक्षण करने की कोशिश कर रहा हूं। हालांकि मुझे यह काम करने के लिए मिला है, मुझे उस सेवा में और तर्क जोड़ने की ज़रूरत है, जिस पर मैं वर्तमान में काम कर रहा हूं। असल में मैं उस वेब ऑब्जेक्ट से प्राप्त ऑब्जेक्ट को कनवर्ट करने के लिए मैपिंग फ़ंक्शन करना चाहता हूं, जिसे मैं एंगुलर में मॉडल ऑब्जेक्ट से जोड़ता हूं।नक्शा समारोह से कोणीय 2 आरएक्सजेएस कॉलिंग क्लास फ़ंक्शन

import { Injectable } from 'angular2/core'; 
import { Http, Response } from 'angular2/http'; 
import { Observable } from 'rxjs/Observable'; 

import { Person } from '../models/person'; 

@Injectable() 
export class PersonsService { 

    constructor(private http: Http) { } 

    private personsUrl = 'http://localhost/api/persons'; 

    getPersons(): Observable<Person[]> { 
     return this.http.get(this.personsUrl) 
      .map(this.extractData) 
      .catch(this.handleError); 
    } 

    private extractData(res: Response) { 
     if(res.status < 200 || res.status >= 300) { 
      throw new Error('Bad response status ' + res.status); 
     } 

     let body = res.json(); 
     return body.data || {}; 
    } 

    private handleError(error: any) { 
     let errMsg = error.message; 
     return Observable.throw(errMsg); 
    } 
} 

ऊपर कोड मैं जो भी कोई समस्या नहीं है के साथ:

इस कोड है कि काम करता है। मेरे पास जो मुद्दा है वह यह है कि मैं उस ऑब्जेक्ट को मैप करना चाहता हूं जो मुझे सेवा से प्राप्त हो रहा है, जिसमें मेरे पास कोणीय i.e. Person है। मैंने जो कोशिश की है वह extractData फ़ंक्शन से दूसरे फ़ंक्शन को कॉल करना है जिसका उपयोग .map फ़ंक्शन द्वारा किया जा रहा है।

private extractData(res: Response) { 
    if(res.status < 200 || res.status >= 300) { 
     throw new Error('Bad response status ' + res.status); 
    } 

    let body = res.json(); 
    // map data function 
    var data = this.mapData(body.data); 

    return data || {}; 
} 

private mapData(data: any) { 
    // code to map data 
} 

जाहिर है इसके बाद के संस्करण कोड के रूप में जब thisextractData समारोह अंदर संदर्भित है, thisPersonsService वर्ग का उल्लेख नहीं करता काम नहीं करता है, लेकिन यह एक MapSubscriber वस्तु को दर्शाता है।

मुझे नहीं पता कि "बाहरी" फ़ंक्शन को कॉल करना संभव है या नहीं। यह एक मूर्ख बात हो सकती है लेकिन मुझे इसके बारे में कोई जानकारी नहीं मिल रही है।

उत्तर

17

सिर्फ function संदर्भ उपयोग arrow कार्यों गुजर के बजाय बनाए रखने के लिए this

.map((res) => this.extractData(res)) 
+0

बिल्कुल सही! बहुत बहुत धन्यवाद :) क्या आप इसके पीछे तर्क की व्याख्या कर सकते हैं? –

+2

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions इसके बिना 'यह' उस फ़ंक्शन को इंगित करेगा जहां कॉल किया गया है। –

+0

मैं इस पर अपने बालों को खींच रहा था। धन्यवाद! –

2

वास्तव में नमूदार के मानचित्र समारोह आप कैसे this वास्तव में उच्च क्रम के अंदर काम करना चाहिए पर एक दूसरे तर्क के रूप में एक संदर्भ चर पारित करने के लिए अनुमति देता है समारोह।
तो समाधान
.map(this.extractData,this)
इस तरह, जबकि extractData समारोह आप भी उच्च क्रम कार्य करने के लिए वर्तमान वर्ग के this निष्पादन संदर्भ से गुजर रहे हैं गुजर रहा है। यह काम करेगा।

Observable Doc Reference Link

screenshot of the doc

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