2016-05-13 77 views
5

我是Angular 2和Observable的新手,所以我很抱歉如果我的問題很瑣碎。無論如何,我試圖使用RxJS來測試Angular 2 HTTP客戶端。雖然我得到它的工作,我需要添加更多的邏輯,我目前正在處理的服務。基本上我想有一個映射函數將我從我連接的Web服務接收到的對象轉換爲我在Angular中使用的模型對象。Angular2 RxJS從地圖函數調用類函數

這是工作的代碼:

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

與上面的代碼我沒有任何問題。我遇到的問題是我想將我從服務中獲得的對象映射到我在Angular中獲得的對象,即Person。我所嘗試的是調用.map函數正在使用的extractData函數中的另一個函數。

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函數內部參考,this不指PersonsService類,但它是指一種MapSubscriber對象。

我不知道是否可以調用「外部」函數。這可能是一件愚蠢的事情,但我無法找到任何有關這方面的信息。

回答

17

而是剛好路過function參考使用arrow功能的保留this

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

完美!非常感謝:)你能解釋一下它的推理嗎? –

+2

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions沒有它'this'將指向調用的函數。 –

+0

我把頭髮拉出來。謝謝! –

2

實際上可觀察的地圖功能可以參考變量傳遞上應該如何this實際上高階內工作第二個參數功能。
所以解決方案
.map(this.extractData,this)
這樣,當經過ExtractData由函數,你也傳遞當前類的this執行上下文的高階函數。 它會工作。

Observable Doc Reference Link

screenshot of the doc