【发布时间】:2021-05-24 18:55:21
【问题描述】:
我是 RxJs 的新手,我正在为一个复杂的 Angular 应用程序而苦苦挣扎,在该应用程序中,我将 observables 嵌套在其他 observables 中(下文简化)。
简而言之,我有:
- 一个Observable,它返回一个带有对象集合的流SearchActivity =>
Observable<SearchActivity[]> - 每个 SearchActivity 对象都有一个 Observable 属性 'results$' =>
BehaviorSubject<SearchActivityResult[]>
我尝试将所有活动中的所有结果提取到一个 Observable 中。 所以,从下面的例子来看(这不是代码,而是数据结构的一个想法):
Observable<SearchActivity[]> => [
{id: 1, results$: Observable<SearchActivityResult[]> => [1, 2]},
{id: 2, results$: Observable<SearchActivityResult[]> => [3, 4, 5]}
{id: 3, results$: Observable<SearchActivityResult[]> => [6]}
]
我想提取结果得到:
Observable<SearchActivityResult[]> => [1, 2, 3, 4, 5, 6] (Edit: the order is not important)
如何使用 RxJs 实现这一点?
到目前为止,我得到了类似的东西:
// This is not working properly
this.allResults$ = this.displayedActivities$.pipe(
mergeMap(activities => {
return concat(...activities?.map(activity => activity.results$ || of([])));
})
);
但它似乎没有按预期工作。
我准备了StackBiltz with a more complex scenario here
2021-02-23 更新
我创建了一个新的StackBlitz,您可以通过单击它与结果进行交互。目标是获取每个数据库的所有结果的摘要(页面底部的表格),并显示所有搜索条件下正面/负面结果的数量。
TL;DR => 解决方案
我刚刚创建了一个复杂性较低的新StackBlitz,以隔离问题。我已经包含了Mrk Sef 提出的建议并且它正在工作。
我在平面运算符和对 json 的奇怪循环引用方面还有一些其他错误,但这更有可能是由 StackBlitz 模拟器引起的。
【问题讨论】:
-
在您的结果中:
[1, 2, 3, 4, 5, 6]- 订单重要吗? -
完全不需要,我只需要一个流中的所有结果
-
这是预期的行为吗? :stackblitz.com/edit/…
-
不,它只会在您的示例中获得最后一个可观察的结果(2 个结果)。应该都有。
-
我会说,如果您可以简单地使用 StackBlitz 应用程序以便仅突出显示问题而无需其他详细信息,那就太好了。
标签: angular merge rxjs observable concatenation