我有一个获取数据结构的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,但是它们涉及更多的代码,我希望代码简短易用。
答案 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()