首页 > 解决方案 > Rxjs:在条件下发出:数组属性与计时器

问题描述

调用 rxjs 向导,可以获得如下流程:

stream1: 1, 2, 3, ... //this stream interval can be paused
array: [{text: "hi", time: 2}, {text: "hi", time: 10}] // static array

emit when current stream1 value === array.time

我尝试过使用 zip、iif 的组合,但没有成功,因此我将不胜感激任何建议或帮助。

标签: javascriptrxjs

解决方案


假设您有一些可观察的源发出一个布尔值来指示是否应该启用“计时器”,您可以像这样定义您的计时器:

const timer$ = enableTimer$.pipe(
  switchMap(isEnabled => isEnabled ? timer(0, 1000) : NEVER),
  scan(time => time + 1, 0)
);

这只是在 1 秒间隔和一个从不发射的空 observable 之间切换源。scan用于始终发出先前发出的值 + 1。

map然后,您可以通过使用返回数组的搜索结果来定义您的“数组发射”,以查找具有匹配时间的元素。我们filter用来过滤掉undefined结果(没有找到匹配的地方):

const arrayEmits$ = timer$.pipe(
  map(time => array.find(i => i.time === time)),
  filter(i => !!i)
);

这是一个StackBlitz 演示


推荐阅读