将params传递给映射的可观察对象

时间:2017-02-20 17:49:42

标签: javascript angular

我对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

2 个答案:

答案 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)

  1. 应使用Map将类型转换为其他类型。使用http服务时,您应该将预期的json结果转换为某种预期和已知类型。这可以使用响应上的.json()方法完成。
  2. 使用subscribe然后对.json()的预期结果执行某些操作。
  3. 您可以在表达式主体中完成所有操作,不需要单独的方法。这是一个优先选择,所以无论你选择什么都没关系。

    见下面的代码。

    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"];
    }