在从 HttpClient 请求获得的对象转换新类型之前,如何使用 rxjs 映射来改变对象中的数据?

Posted

技术标签:

【中文标题】在从 HttpClient 请求获得的对象转换新类型之前,如何使用 rxjs 映射来改变对象中的数据?【英文标题】:How do I use rxjs map to mutate data in object before casting a new type from an object gotten from a HttpClient request? 【发布时间】:2019-12-05 18:03:57 【问题描述】:

希望标题不要太具体。

我正在使用的后端将日期作为字符串返回。我有一个函数可以将该字符串转换为 javascript Date 对象。我使用 Rxjs 映射将 json 响应转换为我的 Typescript 对象,如下所示。


  getAllRecordsByEmployeeId(employeeId: number): Observable<Record[]> 
    return this.http.get<Record[]>(
        this.basePath
        + this.recordPath
        + this.recordEmployeeIdParam
        + employeeId,
        this.httpOptions)
        .pipe(
            map((res: any) => res.records as Record[]),
        );
  

我想在 res.records.startDate 变成一个 Record 对象之前用一个函数来改变它。我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:
getAllRecordsByEmployeeId(employeeId: number): Observable<Record[]> 
    return this.http.get<Record[]>(

我了解,您的 http 请求实际上并未返回 Record 数组。它返回一个带有Record Array 字段的对象,这基本上是另一个Record 模型。它非常相似,但模型不同。

请考虑将其更改为:

interface RecordFromApi extends Record 
  startDate: string; // overwrite attribute


interface RecordResponse 
  records: RecordFromApi[];


getAllRecordsByEmployeeId(employeeId: number): Observable<Record[]> 
    return this.http.get<RecordResponse>(
        this.basePath
        + this.recordPath
        + this.recordEmployeeIdParam
        + employeeId,
        this.httpOptions)
        .pipe(
            map((res: RecordResponse) => res.records.map(record => mapRecord(record))), // mapRecord is a custom function which maps RecordFromApi model to Record model
        );
  

【讨论】:

谢谢。这是一个好主意,将大大提高我的代码质量!【参考方案2】:

我们在我的应用程序中做了类似的事情。但不是返回

res.records as Record[]

我们这样做:

.pipe(
      map((records: Record[]) => records.map(records => new Record(record)))
);

然后在record.ts

export class Record 
  /*
    properties
  */
  date: Date;

  constructor(params: Partial<Record> = ) 
    this.date = new Date(params.date);
  

通过这种方式,您实际上可以获得类的实例,并且可以使用您的类中可能拥有的任何函数(这就是我们提出此解决方案时遇到的问题)。

【讨论】:

以上是关于在从 HttpClient 请求获得的对象转换新类型之前,如何使用 rxjs 映射来改变对象中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

.NET 3.1 中来自 HTTPClient 的 SendAsync 中的对象循环 Json

java httpclient请求为excel导出,从中如何提取数据

HttpClient vs HttpWebRequest 以获得更好的性能、安全性和更少的连接

httpClient 在从 azure 反向代理调用 https 连接时抛出连接重置

如何使用HttpClient

Java HttpClient库的使用