rxjs - RxJs:加载相关资源
问题描述
我正在努力实现以下操作序列:
- 进行 API 调用,从响应中获取数据。作为回应,我将拥有一个指向相关资源的端点数组的属性。例如:
{ ..., relatedResources: ['my.app/api/resource/1', 'my.app/api/resource/2'] }
- 将每个端点映射
relatedResources
到 http request,从每个响应中获取数据,这样我就可以拥有实际的资源数组而不是端点数组。为了说明应该实现的目标:['my.app/api/resource/1', 'my.app/api/resource/2'] => [{...}, {...}]
- 将来自第 1 步和第 2 步的数据结合起来,这些数据基本上是来自第 1 步的数据与映射
realtedResources
属性(包含数据,而不仅仅是端点)
我怎样才能做到这一点,哪些运算符对我的情况有用?
解决方案
我想你可以试试这个:
response$.pipe(
switchMap(
response => forkJoin(
response.relatedResources.map(resource => this.apiService.makeRequest(resource))
).pipe(
// you can perform all sorts of transformations here
// since you have access to both the initial `response`
// and the resulted data
map(resourcesResArray => ({
...response,
relatedResources: resourcesResArray,
}))
)
)
)
forkJoin
接受一个可观察对象数组(或一个其值为可观察对象的对象),并将订阅所有这些对象,并将发出一个数组,其中包含来自每个可观察对象的所有响应和一个通知,以防所有给定的可观察对象至少complete
发出一个value 并完成,或者只是一个通知,以防所有 observables 都完成并且至少一个没有发送任何值。complete
这是实现forkJoin
,值得一看,也很有趣。
然后,通过使用闭包,我们可以引用response
包含endpoints
.
此外,这种方法假定this.apiService.makeRequest
返回一个可观察对象,该可观察对象在发出响应后完成。
推荐阅读
- php - 在主题中加载特定的 WooCommerce 模板
- bash - 将代码拆分为文件
- unity3d - 为什么我的搅拌机 .fbx 文件没有导出到 Unity?
- asp.net-core - 如何在 Asp net core 3.1 中通过身份服务器 4 中的用户 ID 获取 access_token、刷新令牌
- java - 导入比主 gradle 项目文件高一级的额外项目
- c# - 是否可以在 C# 中为 KeyValuePairs 的 LinkedList 创建序列化代理?
- r - R循环使用data.table标准化变量
- postgresql - 如何更改露天开始目录?
- c++ - 我如何在 wxWidgets 中绘图?
- node.js - 在 Nock 中,URL 对我来说似乎没问题,但不匹配