我对Observables,Promises,Angular 2和Javascript相当新。
我的问题是如何获得对"项目的引用"对象在这里:
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
答案 0 :(得分: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);
}
这可能不是你想要做的。通常的模式是让一个函数在代码中的其他地方返回一个observable和subscribe()
到该observable。您可以在订阅回调中进行作业。
这将转换为以下代码:
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
}
答案 1 :(得分:1)
.json()
方法完成。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"];
}