2017-02-20 80 views
0

我對Observables,Promises,Angular 2和Javascript相當陌生。將params傳遞給映射的observable

我的問題是我怎麼到「項」對象的引用在這裏:

getItemTransactions (item: Item): Observable<any> { 
    // Do some stuff ... 

    return this.http.post(this.url, body, options) 
        .map(this.extractData) 
        .catch(this.handleError); 
    } 

在映射ExtractData由助手?

private extractData(res: Response) { 
    let json = res.json().body 

    /// How do I assign back to item object here? 
    item.some_property = json["some_property"] 
    } 

代碼來自這裏: https://angular.io/docs/ts/latest/guide/server-communication.html#!#extract-data

回答

1
  1. 地圖應使用一種類型轉換爲另一種類型。在使用http服務時,您應該將您期望的json結果轉換爲某種預期的和已知的類型。這可以通過使用.json()方法來完成。
  2. 使用subscribe然後從.json()做一些預期的結果。

您的所有操作都可以在表達式主體中完成,您不需要單獨的方法。這是一個優先選擇,所以無論你選擇什麼都很好。

查看下面的代碼。

getItemTransactions (item: Item): Observable<any> { 
// Do some stuff ... 

    return this.http.post(this.url, body, options) 
       .map((res) => res.json()) // get the data from the json result. This is equivalent to writing {return res.json()} 
       .subscribe((data) => { 
        this.doSomethingWithData(data, item); // pass that deserialized json result to something or do something with it in your expression 
       }) 
       .catch(this.handleError); 
} 

private doSomethingWithData(data: any, item: Item) { 
    // Do some stuff ... 

    item.some_property = data["some_property"]; 
} 
1

你爲什麼要重新分配在首位的方法參數?您可能想要分配類屬性(this.item vs item)。

但是,如果由於某種原因,你真的要重新分配item PARAM,你總是可以內嵌在extractData幫手,即:

getItemTransactions(item: Item): Observable<any> { 
    return this.http.post(this.url, body, options) 
       .map((res: Response) => { 
        item = res.json(); // Re-assign some value to `item` 
       }) 
       .catch(this.handleError); 
} 

這可能不是你想要做什麼。通常的模式是讓函數返回一個可觀察值,並將subscribe()返回給代碼中其他位置的可觀察值。您可以在訂閱回撥內完成的分配。

這將轉化成下面的代碼:

getItemTransactions(item: Item): Observable<any> { 
    return this.http.post(this.url, body, options) 
       .map((res: Response) => res.json()) 
       .catch(this.handleError); 
} 

// Somewhere else in your code 
this.getItemTransactions(item: Item).subscribe(data => { 
    item = data; // for instance 
} 
相關問題