从另一个 Observable 数组中过滤 Observable 数组元素
Filtering Observable array elements from another Observable array
我在过滤一个可观察数组时遇到了问题,在我的例子中它是 resources$
(一个包含所有 'resourses' 作为 JSON 的可观察数组),我还有另一个可观察数组 [= =11=],我想要实现的只是从这 2 个变量 (resources - usedResources = unusedResources) 中获取 unusedResources$
,有没有任何 RxJS 方法可以实现这个?
如果您有多个流并且您想以某种方式组合它们中的每个项目,通常这意味着 combineLatest
或 zip
,具体取决于您所需的组合策略。
合并最新 | documentation
如果你想从每个流中的最新项目计算最新的,不管它们相对于彼此的发射有多快或多慢,你可以使用 combineLatest
; Observable.combineLatest
或基于原型的 stream$.combineLatest
具有相同的效果,但包括您调用它的流而不是静态工厂。为了清楚起见,我个人更经常使用静态形式。
这可能就是您想要的。
const unusedResources$ = Observable.combineLatest(
resources$,
usedResources$,
(resources, usedResources) => ({
something: resources.something - usedResources.something
})
);
const { Observable } = Rx;
const resources$ = Observable.interval(5000).map(i => ({
something: (i + 1) * 1000
}));
const usedResources$ = Observable.interval(1000).map(i => ({
something: (i + 1) * 10
}));
const unusedResources$ = Observable.combineLatest(
resources$,
usedResources$,
(resources, usedResources) => ({
something: resources.something - usedResources.something
})
);
unusedResources$.subscribe(
unusedResources => console.log(unusedResources)
);
<script src="https://unpkg.com/rxjs@5.4.0/bundles/Rx.min.js"></script>
压缩 | documentation
如果您想合并每个项目 1:1,即等待每个流为给定索引发出一个项目,您可以使用 zip
。然而,在引擎盖下它使用了一个无限缓冲区,所以如果你的流不在大约相同的时间间隔发出,你可能会增加你的内存使用量,甚至 运行 完全耗尽。在大多数情况下,这应该只用于具有有限的、可预测的计数和间隔的流。例如,如果您进行了 N 次 ajax 调用并希望合并它们的结果 1:1.
我在过滤一个可观察数组时遇到了问题,在我的例子中它是 resources$
(一个包含所有 'resourses' 作为 JSON 的可观察数组),我还有另一个可观察数组 [= =11=],我想要实现的只是从这 2 个变量 (resources - usedResources = unusedResources) 中获取 unusedResources$
,有没有任何 RxJS 方法可以实现这个?
如果您有多个流并且您想以某种方式组合它们中的每个项目,通常这意味着 combineLatest
或 zip
,具体取决于您所需的组合策略。
合并最新 | documentation
如果你想从每个流中的最新项目计算最新的,不管它们相对于彼此的发射有多快或多慢,你可以使用 combineLatest
; Observable.combineLatest
或基于原型的 stream$.combineLatest
具有相同的效果,但包括您调用它的流而不是静态工厂。为了清楚起见,我个人更经常使用静态形式。
这可能就是您想要的。
const unusedResources$ = Observable.combineLatest(
resources$,
usedResources$,
(resources, usedResources) => ({
something: resources.something - usedResources.something
})
);
const { Observable } = Rx;
const resources$ = Observable.interval(5000).map(i => ({
something: (i + 1) * 1000
}));
const usedResources$ = Observable.interval(1000).map(i => ({
something: (i + 1) * 10
}));
const unusedResources$ = Observable.combineLatest(
resources$,
usedResources$,
(resources, usedResources) => ({
something: resources.something - usedResources.something
})
);
unusedResources$.subscribe(
unusedResources => console.log(unusedResources)
);
<script src="https://unpkg.com/rxjs@5.4.0/bundles/Rx.min.js"></script>
压缩 | documentation
如果您想合并每个项目 1:1,即等待每个流为给定索引发出一个项目,您可以使用 zip
。然而,在引擎盖下它使用了一个无限缓冲区,所以如果你的流不在大约相同的时间间隔发出,你可能会增加你的内存使用量,甚至 运行 完全耗尽。在大多数情况下,这应该只用于具有有限的、可预测的计数和间隔的流。例如,如果您进行了 N 次 ajax 调用并希望合并它们的结果 1:1.