首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >级联映射后映射

级联映射后映射
EN

Stack Overflow用户
提问于 2022-10-20 13:03:03
回答 1查看 30关注 0票数 0

我有以下可观察到的:

代码语言:javascript
复制
existingFormData$: Observable<any> = this.activatedRoute.params.pipe(
    map(params => params['id']),
    filter(id => !!id),
    switchMap((id: string) => this.httpService.getUniversityApplicationsDetail(id)),
    concatMap((detail: any) => this.httpService.getUniversityApplicationsFeesOptions(detail.meta.university.id)),
    tap((detail: any) => {
      console.log(detail)
    })
  );

我正在查找地址栏中包含的id,调用第一个api,从第一个api获得一个id值,并将其发送到第二个api。这两个apis都返回一个对象。concatMap是正确的运算符吗?在“我的网络”选项卡上查找似乎很有效。

我遇到的问题是,这两个apis的结构完全相同。如何构造如下所示的一个对象:

代码语言:javascript
复制
{
    apiOne: apiOne,
    apiTwo: apiTwo
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-20 13:21:49

您可以通过在第二个调用之后添加另一个管道来组合来自这两个调用的结果。这允许您的两个响应变量位于相同的范围内,因此您可以从这两个值形成一个对象。

该技术将在更详细的here中进行解释。

代码语言:javascript
复制
existingFormData$: Observable<any> = this.activatedRoute.params.pipe(
    map(params => params['id']),
    filter(id => !!id),
    switchMap(id => this.httpService.getUniversityApplicationsDetail(id)),
    switchMap(detail => this.httpService.getUniversityApplicationsFeesOptions(detail.meta.university.id).pipe(
        map(options => ({ detail, options }))
    )),
    tap(obj => {
      console.log(obj)
    })
  );

注意:如果您的服务方法只发出一个值,那么使用concatMapswitchMap并不重要,其行为将是相同的。当一个可观察到的值发出多个值时,这种差异就会起作用。

  • concatMap将在订阅next
  • switchMap之前等待第一个内部源完成,一旦接收到新的发射(不等待完成),next
  • switchMap将从当前内部源取消订阅)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74140349

复制
相关文章

相似问题

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