【发布时间】:2020-10-04 11:10:24
【问题描述】:
我想在 RxJS 中实现以下行为,但找不到使用可用运算符的方法:
- 流 A:由连续的事件流生成(例如浏览器滚动)
- 流 B:由另一个任意事件(例如某种用户输入)生成
- 当 B 发出一个值时,我想暂停 A 的处理,直到经过指定的时间。 A 在此时间范围内发出的所有值都将被丢弃。
- 当 B 在此间隔内发出另一个值时,将重置间隔。
- 间隔过后,A 发出的值不再被过滤。
// Example usage.
streamA$
.pipe(
unknownOperator(streamB$, 800),
tap(val => doSomething(val))
)
// Output: E.g. [event1, event2, <skips processing because streamB$ emitted>, event10, ...]
// Operator API.
const unknownOperator = (pauseProcessingWhenEmits: Observable<any>, pauseIntervalInMs: number) => ...
我认为throttle 可以用于这个用例,但是它不会让任何发射通过,直到 B 第一次发射(可能永远不会!)。
streamA$
.pipe(
// If B does not emit, this never lets any emission of A pass through!
throttle(() => streamB$.pipe(delay(800)), {leading: false}),
tap(val => doSomething(val))
)
一个简单的技巧是例如手动订阅 B,在 Angular 组件中存储发出值时的时间戳,然后过滤直到指定的时间过去:
(显然违背了反应式框架的副作用避免)
streamB$
.pipe(
tap(() => this.timestamp = Date.now())
).subscribe()
streamA$
.pipe(
filter(() => Date.now() - this.timestamp > 800),
tap(val => doSomething(val))
)
在我构建自己的自定义运算符之前,我想在这里与专家核实是否有人知道一个运算符(组合)可以在不引入副作用的情况下执行此操作:)
【问题讨论】:
标签: javascript angular rxjs