首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理角7中的嵌套HTTP请求?

如何处理角7中的嵌套HTTP请求?
EN

Stack Overflow用户
提问于 2019-07-31 05:10:03
回答 2查看 389关注 0票数 0

我有一个从服务器获取数据的通用服务。当收到响应时,我使用mapper函数将纯JSON数据映射到所需的模型。对于mapper函数中的某些类类型,我需要从服务器获得一些额外的数据。如何强制mapper函数等待第二个请求?

这是我的get功能:

代码语言:javascript
复制
 getChildren(params: ITreeQueryParams): Observable<Optional<T[]>> {
    params.id = isPresent(params.id) ? params.id : 0;
    params.parentId = isPresent(params.parentId) ? params.parentId : 0;
    params.isRoot = isPresent(params.isRoot) ? params.isRoot : false;
    params.additionalId = isPresent(params.additionalId) ? 
    params.additionalId : 0;
    return this.http.get<IListResponse<T>>
(`${this.resourceUrl}/getChildren/${params.id}/${params.parentId}/${params.isRoot}/${params.additionalId}`,
      {
        observe: 'response'
      }).pipe(map((resp) => this.mapResponse(resp,this.model)));
  }

这是我的地图功能:

代码语言:javascript
复制
 protected mapResponse(resp: any, model: IAsset): void {
    if (resp) {
      this.anotherTreeService.getNodeDetail(resp.id, resp.isRoot).subscribe(res => {
        model.additionalData = {canEdit: res.length > 0 ? true : false};
      });
      if (resp.name) {
        model.title = resp.name;
      }
    }
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-31 05:33:13

在RxJS中有很多运营商可以实现您想要的结果。当数据模型本身并不包含所有数据并且需要一个单独的调用来根据第一个结果检索附加数据时,您经常看到的是这样的示例:

代码语言:javascript
复制
this.myFirstService.getById(id).pipe(
   map(data => jsonToMyModel(data)),
   tap(model => this.data = model),
   switchMap(model => {
      return this.mySecondService.getListById(model.id)
   }),
   tap(secondData => this.data.list = secondData)
).subscribe()

这改变了您正试图实现的目标,因为通过使用forkJoin()mergeMap(),所有数据都有可能最终由可观察的人返回一个模型。这些操作符中的任何一个都有它们在这种情况下的用法。

希望这能有所帮助。一个更明确和直接的例子,你想要什么,将需要一个更完整的问题与一些例子,你想要什么,你尝试了什么。

票数 2
EN

Stack Overflow用户

发布于 2019-07-31 05:31:31

如果我对你的理解是正确的,你只想提出一个请求,并为它提出子请求。

为此,如果需要接受许多子请求,可以使用switchMapforkJoin

下面是您如何重写代码(我将编写一个简化版本)

代码语言:javascript
复制
getChildren() {
  this.http.someRequest.pipe(
    tap(response => {
        if (resp.name) {
          model.title = resp.name;
        }
    }),
    switchMap(response =>
        forkJoin(
            response.map(r => this.http.someRequest(r))
        )
    )
  )
}

switchMap所做的是在每个源发射(您的第一个可观测的)之后,它订阅在回调中可观察到的返回(如果它已经订阅了,它首先从可观察的回调中取消订阅)。

forkJoin的工作方式类似于Promise.all。您可以在那里传递一个Array、Object或多个可观测值(现在已不再推荐),在订阅中,您可以获得Array或Object。

请注意,只有当所有可观测的forkJoin完成时,才会发出由每个可观测的发送的最后一个值。此外,如果任何可观察到的完成没有发射值,forkJoin也完成没有发射值。因为所有的http.whatever都是可观察的,只有一个next和直接的complete,在那之后你就不用担心了。

同样,如果有任何可观测的错误,forkJoin错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57283581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档