从另一个Observable数组中过滤Observable数组元素

时间:2017-06-01 21:05:44

标签: javascript json typescript rxjs rxjs5

我有一个过滤可观察数组的问题,在我的例子中它是resources$(一个包含所有'资源'作为JSON的可观察对象),我有另一个名为usedResources$的可观察对象,我想要的实现只是从那两个变量(资源 - usedResources = unusedResources)获取unusedResources$,是否有任何RxJS方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

如果你有多个流,并且想要以某种方式组合它们中的每个项目,通常这意味着combineLatestzip,具体取决于您所需的组合策略。

combineLatest | 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>

zip | documentation

如果您想要将每个项目1:1组合,即等待每个流为给定索引发出项目,则可以使用zip。但是,它使用无界缓冲区,因此如果您的流不会以大约相同的间隔发射,则可能会使内存使用量增加,甚至完全耗尽。在大多数情况下,这应仅用于具有有限,可预测的计数和间隔的流。例如,如果您进行了N次ajax调用,并希望将它们的结果合并为1:1。