从带有承诺的角度http.get返回正确的对象

时间:2019-04-02 06:53:09

标签: angular http promise

我有一个获取数据结构的http get函数,但是我真的很想拥有实际的对象(我有函数)。

public async get(guid: string): Promise<PctLayer>
{
    return await this.http.get<PctLayer>(`${this.url}/${guid}`, { headers: this.header }).toPromise();
}

我可以通过

解决
let layer = Object.assign(new PctLayer(), await this.layerService.get(info.id));

这很好地完成了工作。有没有一种方法可以将Object.assign移到异步get中?我无法使其与Promise一起使用,即我不确定在异步get中调用Object.assign时如何仍然返回Promise。

我知道有一种解决方案,而不是使用Object.assign,但是它们涉及更多的代码,我希望代码简短易用。

1 个答案:

答案 0 :(得分:0)

return await this.http.get<PctLayer>(`${this.url}/${guid}`, { headers: this.header })
.map(r => {
  Object.assign(new PctLayer(), r);
})
.toPromise()

可能为您工作。在将其映射为Promise之前,只需将Object.assign包含在可观察链中即可

编辑

因为我属于RxJS 5时代,所以以下也是6.x版本:

return await this.http.get<PctLayer>(`${this.url}/${guid}`, { headers: this.header })
.pipe(map(r => {
  Object.assign(new PctLayer(), r);
}))
.toPromise()

再进行一次编辑

在我的个人项目中,当我需要将HTTP提取中的数据注入到对象时,通常只需使用REST响应作为输入参数来构造新对象:

export interface MyClassInterface {
  A: string;
}
export class MyClass implements MyClassInterface{
  public A: string;
  constructor(iIn: MyClassInterface) {
    this.A = iIn.A
    /* and so on */
  }
  public myUsefulFinction() { /*Do stuff*/ }
}

然后假设GET-response与接口兼容,您可以

return await this.http.get<PctLayer>(`${this.url}/${guid}`, { headers: this.header })
.pipe(map(ifc => MyClass(ifc)))
.toPromise()