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 类型的完全相同的泛型可用于 postput。它不会自动转换为对象,但您可以为 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());
}