javascript - 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 的组合,但没有成功,因此我将不胜感激任何建议或帮助。
解决方案
假设您有一些可观察的源发出一个布尔值来指示是否应该启用“计时器”,您可以像这样定义您的计时器:
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 演示
推荐阅读
- python - 如何读取包含多个 json 和使用的分隔符的文本文件是 Python 中带空格的新行
- macos - 为什么我需要创建符号链接,文件夹/in/path 对应的是什么?在 Mac 上为当前用户安装 aws cli 2 时
- python - 当我的鼠标悬停在圆圈上时,圆圈不会改变颜色
- java - 使用 glide 在回收站视图中加载 5,000 张图像
- java - Spring JPA 一对多无限递归
- android - 在 Kotlin 上使用 Cloud Firestore 设置全局变量
- php - ErrorException preg_match():编译失败:偏移量 28 处的字符类范围无效
- python-3.x - 如何从日期列中选择一个值并将其存储在矩阵中
- vb.net - 如何使用VB将某个文件扩展名移动到一个文件夹中
- c++ - VS2019 Linux C++:未定义引用“dlopen”,未应用 g++ -ldl 编译器标志