2017-02-20 74 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 
} 
相关问题