我有一个过滤可观察数组的问题,在我的例子中它是resources$
(一个包含所有'资源'作为JSON的可观察对象),我有另一个名为usedResources$
的可观察对象,我想要的实现只是从那两个变量(资源 - usedResources = unusedResources)获取unusedResources$
,是否有任何RxJS方法来实现这一目标?
答案 0 :(得分:1)
如果你有多个流,并且想要以某种方式组合它们中的每个项目,通常这意味着combineLatest
或zip
,具体取决于您所需的组合策略。
如果您想要计算每个流中最新项目的最新项目,无论它们相对于彼此发出的速度有多快或多慢,您都可以使用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>
如果您想要将每个项目1:1组合,即等待每个流为给定索引发出项目,则可以使用zip
。但是,它使用无界缓冲区,因此如果您的流不会以大约相同的间隔发射,则可能会使内存使用量增加,甚至完全耗尽。在大多数情况下,这应仅用于具有有限,可预测的计数和间隔的流。例如,如果您进行了N次ajax调用,并希望将它们的结果合并为1:1。