Angular 地图 HttpClient.Post
Angular map HttpClient.Post
所以我终于决定赶上时代,把一些旧的angularHttp
东西迁移到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());
}
但我目前不喜欢的是,在 each 订阅中,我现在必须将数据映射到 User...
service.getUser(1).subscribe(data => {
data = new User(data);
});
这是我所拥有的最简单的 .map
,一些 post 方法实际上 return 一个相当复杂的对象,它映射到许多新的对象实例。
我看到 HttpClient.get
你可以键入断言响应,我可以用 .post
做这样的事情吗,这样我就不必将数据映射到每个新用户订阅?
注意:最终我会再次将其迁移到更好的架构,您实际上订阅了一个 User 变量,但现在我只想实现 HttpClient。
如果您在服务中导入您的用户 class,您可以通过在 post
之后和 ()
public getUser(profileId: number): Observable<any> {
return this.http.post<User>("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions());
}
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
<= 是的,指定 return 类型的完全相同的泛型可用于 post
和 put
。它不会自动转换为对象,但您可以为 returned 数据指定一个接口。或者,您可以像以前一样在服务中链接 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());
}
所以我终于决定赶上时代,把一些旧的angularHttp
东西迁移到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());
}
但我目前不喜欢的是,在 each 订阅中,我现在必须将数据映射到 User...
service.getUser(1).subscribe(data => {
data = new User(data);
});
这是我所拥有的最简单的 .map
,一些 post 方法实际上 return 一个相当复杂的对象,它映射到许多新的对象实例。
我看到 HttpClient.get
你可以键入断言响应,我可以用 .post
做这样的事情吗,这样我就不必将数据映射到每个新用户订阅?
注意:最终我会再次将其迁移到更好的架构,您实际上订阅了一个 User 变量,但现在我只想实现 HttpClient。
如果您在服务中导入您的用户 class,您可以通过在 post
之后和 ()
public getUser(profileId: number): Observable<any> {
return this.http.post<User>("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions());
}
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
<= 是的,指定 return 类型的完全相同的泛型可用于 post
和 put
。它不会自动转换为对象,但您可以为 returned 数据指定一个接口。或者,您可以像以前一样在服务中链接 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());
}