angular - RXJS - 对属性数组的多个可观察调用

标签 angular typescript rxjs observable

我是 rxjs 的新手,我有一个相当简单的案例,我无法用 angular 解决。

我有一个 http 调用来检索一个组,这个组包含一个“好友 ID”列表、一个“流派 ID”列表和一个“区域 ID”列表。

要通过“好友 ID”获取好友对象,我必须通过我的服务调用 API(返回 1 个具有给定 ID 的好友)。

要获取我的流派对象,我可以从我的商店中检索它们,对于区域也是如此。

问题是我无法用管道解决问题。

this.buddyService.getGroup(groupId).pipe(
    mergeMap((group) => forkJoin(
          mergeMap(() => forkJoin(group.buddyIds.map((id) => this.buddyService.getBuddy(id)))), 
          mergeMap(() => forkJoin(group.genreIds.map((id) => this.store.select(GenreState.genre(id))))),
          switchMap(() => this.store.select(RegionState.region(group.regionId))))
    ), takeUntil(this.destroyed$)
).subscribe(([group, buddies, genres, region]) => {

});

所以第一个 mergeMap 将在 1 个订阅中获得所有结果,然后我有 3 个子调用来获得伙伴、流派和地区。

我想要我的初始响应(组)和 1 订阅中的 3 个子调用的结果,显然这个解决方案不起作用,而且我似乎无法让其他东西起作用。

任何帮助将不胜感激,谢谢!

最佳答案

您似乎有太多内部 mergeMap。试试这个

this.buddyService.getGroup(groupId).pipe(
  mergeMap((group) => forkJoin(
    of(group),
    forkJoin(...group.buddyIds.map((id) => this.buddyService.getBuddy(id))), 
    forkJoin(...group.genreIds.map((id) => this.store.select(GenreState.genre(id)))),
    this.store.select(RegionState.region(group.regionId)))
  ),
  takeUntil(this.destroyed$)
)
.subscribe(([group, buddies, genres, region]) => {});

主要问题是您将创建 Observables(如forkJoin)的“构造”方法与对现有进行操作的运算符组合在一起可观察对象(如 switchMapmergeMap)。

自己测试差异:switchMap对比forkJoin

我写的这个没有深入测试,所以它可能不会立即工作:)

关于angular - RXJS - 对属性数组的多个可观察调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55307110/

相关文章:

angular - 为什么 microsoft-adal-angular6 没有附加不记名 token ?

javascript - 如何在不同位置渲染指令内的内容

javascript - 构建 react 应用程序的版本,提供指向 CSS 和 JS 文件的错误链接

error-handling - 在合并的可观察对象上捕获错误,并在RxJS中继续其他错误

javascript - 如何在 Angular 6 中处理多个 http 请求

javascript - 自定义组件 Angular 所需的传递

angular - moment().add() 仅适用于文字值

javascript - 如何设置一个工厂函数来实现它在Typescript中生成的类的参数调用签名?

typescript - Angular 2 : Catching 401 error for token refresh

javascript - 如何将某物推送到返回数组的函数?(是否可以推送到返回数组的函数)