如何根据从另一个可观察对象返回的数组中的键创建可观察/ http请求数组

Posted

技术标签:

【中文标题】如何根据从另一个可观察对象返回的数组中的键创建可观察/ http请求数组【英文标题】:How can I create an array of observable/http requests based on keys in an array that are returned from another observable 【发布时间】:2019-04-05 02:23:37 【问题描述】:

所以我试图围绕 Observables 进行思考,并且在大多数情况下它们是有意义的——但所有文档都假设你实际上是在处理数据流——并且 Angular 使每个 http 调用都默认为 observable ,即使这些不是流,而是返回的隔离值,这给我造成了一些混乱。

所以,我进行了一个 http 调用,它返回一个对象数组。然后我需要映射该数组,并根据每个对象中的键生成一个新的 http 调用。然后我需要收集来自这些调用的所有响应,并映射初始数组以根据来自第二个调用数组的响应设置属性。

请原谅 Sudo 代码

this._http.get<>(url).subscribe(value => myData = value);

返回一个类似的数组

[
 clientId: 1, ..additional properties,
 clientId: 2, ..additional properties,
]

然后我需要映射它并像这样生成新的 http 调用

response.map(item => 
 this._http.get(`someurl/$item.clientId)

然后我需要将所有这些调用组合成一个数据块,这样我就可以做类似的事情

myData.map(item => 
item.fullClient = ArrayOfClientReturns.find(client => client.id === item.clientId);

我的问题是我完全理解如何使用 Promise 来做到这一点,但是对于 observables,我真的不确定。我了解如何使用 pipe(map()) 来组合可观察对象,但我不明白如何映射数据数组并根据初始可观察对象的响应生成可观察对象集合,然后等待它们全部解决,然后像这样重新映射初始数据集。

我确定我只是在 rxjs 文档中遗漏了正确的方法,但每个示例都显示了在您尝试组合它们之前组合已经存在的可观察对象。

如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

【参考方案1】:

你绝对是在正确的道路上,你应该能够使用像forkJoin这样的东西,它将加入一个Observables的数组

 this._http.get<any[]>(url).pipe(
        mergeMap(arr => forkJoin(arr.map((item) => this._http.get(`someurl/$item.clientId`).pipe(map((name) => 
           item.name = name;
           return item;
        )
 ))))

这里,我们使用数组map函数将对象数组转换为Observables数组。然后我们使用 forkJoin 将 observable 数组合并为一个,并使用 mergeMap 将其加入到原始请求中。

(请注意,这是使用新的 rxjs 语法,pipe,但也可以使用旧语法)

【讨论】:

这让我更进一步,但最终没有为我带来任何回报。 return programDocuments$.pipe(mergeMap(documents => forkJoin(documents.map(item => this._http.get(employee/2079/full-name)))));最终返回 [],我不知道为什么 @trattles 它应该返回一个你需要订阅的 Observable 所以另一个问题,第二个接收 ID 的端点只返回一个字符串 - 所以我需要一些方法来维护 id 到响应的映射...:/ 它确实返回了一个 observable。订阅的 observable 发出 [] 这正是我所需要的。非常感谢。我想我现在对 observables 的理解要好得多。

以上是关于如何根据从另一个可观察对象返回的数组中的键创建可观察/ http请求数组的主要内容,如果未能解决你的问题,请参考以下文章

ngFor正在根据可观察变量的变化重新渲染内容

如何根据javascript中的键合并和替换两个数组中的对象?

ES6对象的新增方法

如何使剔除可观察数组中的对象属性可观察?

如何根据对象数组中的键获取值javascript

如何返回一个空的可观察对象