【问题标题】:Map result from api to observables将结果从 api 映射到 observables
【发布时间】:2020-10-12 12:02:07
【问题描述】:

我正在尝试使用 Rxjs 映射来自 API 的响应,如下所示

在服务中我有以下内容

export interface Response {
  data: Array<Data>;
  headers: Headers
}

public fetchData(): Observable<Response> {
   return http.get<Response>(myurl);
}

在我的组件中,我想将响应映射到以下 observables

headers$: Observable<Headers>;
data$: Observable<Array<Data>>;

onInit(){
   myservice.fetchData()
     .pipe(
        //mapping response to the two observables here
     )
}

这样我就可以在我的模板中使用异步管道绑定我的data$ observable,如下所示

<div *ngIf="let item of data$ | async">
   {{ Whatever }}
</div>

【问题讨论】:

  • 从 http 调用收到的数据是什么形状的?我问是因为我相信响应界面应该改变
  • 我得到一个包含两项的对象 1. headers 对象 2. 数据项列表例如{ headers: { } , data : [ ] }
  • 您只需要数据吗?而不是标题?

标签: angular rxjs async-pipe


【解决方案1】:

您可以使用 rxjs 运算符操作流,但在您的情况下,您需要使用给定的流初始化您的 observables。

快速的解决方案是将每个可观察对象映射到想要的信息:

headers$: Observable<Headers>;
data$: Observable<Array<Data>>;

onInit(){
  this.headers$ = this.myService.fetchData().pipe(stream => stream.headers);
  this.data$ = this.myService.fetchData().pipe(stream => stream.data)

}

但这意味着每次渲染组件时都会进行两次 http 调用。

更好的解决方案是使用 Smart / Dump 架构和异步管道:

父组件:

response$: Observable<Response>;

onInit(){
  this.response$ = this.myService.fetchData();

}

父模板:

<ng-container *ngIf="response$ | async as response"
  <app-child [response]="response"></app-child>
</ng-container>

子组件:

@Input() response: Response

子模板:

<div *ngFor="let item of response.data">
   {{ Whatever }}
</div>

【讨论】:

    【解决方案2】:

    您可以使用 rxjs map 运算符来实现您所需要的,如下所示:

    headers$: Observable<Headers>;
    data$: Observable<Array<Data>>;
    
    onInit(){
       const response = this.myservice.fetchData();
       this.headers$ = response.pipe(map(resp => resp.headers));
       this.data$ = response.pipe(map(resp => resp.data));
    }
    

    现在您可以在模板文件中使用data$ 和header$ 可观察对象以及async 管道来显示各自的数据。

    【讨论】:

      【解决方案3】:

      我认为你只对 observable 感兴趣,所以我建议你订阅你的 fetchData 方法。然后您可以映射该响应。例如:

      myservice.fetchData().subscribe(
            (data)=>{
              //Map your response here  
            }
          )
      

      另外一种选择是,您可以在 fetchData 方法中进行映射,而不是在组件中进行。

      【讨论】:

      • 重点是使用异步管道订阅可观察对象,因此在组件内部订阅无济于事
      猜你喜欢
      • 1970-01-01
      • 2020-04-16
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 2018-12-21
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多