所以我最终决定赶上时间并将一些旧的角度Http
内容迁移到HttpClient
。
该应用程序曾经在一堆基于Promise的代码上运行,该代码已被删除(主要是)。我的旧Promise功能看起来像这样:
public getUser(profileId: number): Promise<User> {
return this.http.post("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions());
.map(u => new User(u))
.catch(this.handleError)
.toPromise();
}
我的新HttpClient功能更好:
public getUser(profileId: number): Observable<any> {
return this.http.post("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions());
}
但我目前不喜欢的是,在每个订阅中,我现在必须将数据映射到用户的实例...
service.getUser(1).subscribe(data => {
data = new User(data);
});
这是我所拥有的最简单的.map
,一些post方法实际上会返回一个相当复杂的对象,该对象映射到许多新的对象实例。
我看到HttpClient.get
您可以输入断言响应,我可以使用.post
执行此类操作,以便我不必将数据映射到每个用户订阅?
注意:最终我会再次将其迁移到更好的架构,您实际上订阅了一个User变量,但是现在我只想实现HttpClient。
答案 0 :(得分:4)
can I do something like this with .post so that I don't have to map the data to a new User in each of the subscriptions
&lt; =是,指定返回类型的完全相同的通用可用于post
和put
。它不会自动转换为对象,但您可以为返回的数据指定接口。或者,您可以像以前一样在服务中链接map
,但我建议您使用pipeable operators。
使用pipeable operators模仿您之前代码中的内容的示例。
import { map } from 'rxjs/operators/map';
public getUser(profileId: number): Observable<User> {
return this.http.post("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions())
.pipe(map(data => new User(data)));
}
其中User
只不过是具有属性的接口的示例。
如果数据本身是json代表具有属性的接口,则可以直接转换它。
export interface User {
userId: number;
name: string;
}
public getUser(profileId: number): Observable<User> {
return this.http.post<User>("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions());
}
答案 1 :(得分:1)
如果您在服务中导入User类,则可以在User
之后和<User>
之前添加post
将其映射回()
对象
public getUser(profileId: number): Observable<any> {
return this.http.post<User>("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions());
}