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

Filtering Observable array elements from another Observable array

我在过滤一个可观察数组时遇到了问题,在我的例子中它是 resources$(一个包含所有 'resourses' 作为 JSON 的可观察数组),我还有另一个可观察数组 [= =11=],我想要实现的只是从这 2 个变量 (resources - usedResources = unusedResources) 中获取 unusedResources$,有没有任何 RxJS 方法可以实现这个?

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

合并最新 | documentation

如果你想从每个流中的最新项目计算最新的,不管它们相对于彼此的发射有多快或多慢,你可以使用 combineLatestObservable.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.