如何在流 B 触发时抑制流 A 的下一个事件
我想每当流 B 触发时就停止流 A 以获得一个通知。两个流都将保持在线状态并且永远不会完成。
A: o--o--o--o--o--o--o--o--o
B: --o-----o--------o-------
R: o-----o-----o--o-----o--o
或者
A: o--o--o--o--o--o--o--o--o
B: -oo----oo-------oo-------
R: o-----o-----o--o-----o--o
I want to stop stream A for exactly one notification whenever stream B fires. Both streams will stay online and won't ever complete.
A: o--o--o--o--o--o--o--o--o
B: --o-----o--------o-------
R: o-----o-----o--o-----o--o
or
A: o--o--o--o--o--o--o--o--o
B: -oo----oo-------oo-------
R: o-----o-----o--o-----o--o
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是我为 类似问题所做的
SkipWhen
运算符的版本 (区别在于,在原来的情况下,多个“B”会跳过多个“A”):如果当前实现成为瓶颈,请考虑更改锁实现以使用
ReaderWriterLockSlim
。Here's a version of my
SkipWhen
operator I did for a similar question (the difference is that, in the original, multiple "B's" would skip multiple "A's"):If the current implementation becomes a bottleneck, consider changing the lock implementation to use a
ReaderWriterLockSlim
.当可观察量很热时(并且没有
refCount
),此解决方案将起作用:.takeUntil(streamB)
:使流A
在流B
产生一个值。.skip(1)
:使流A
在启动时跳过一个值(或作为.repeat()
的结果)。.repeat()
:使流A
无限期地重复(重新连接)。.merge(streamA.take(1))
:在流的开头偏移.skip(1)
的效果。让 A 流每 5 秒跳过一次的示例:
您还可以使用此沙箱 http://jsbin.com/gijorid/4/edit?js ,console 在运行代码时在控制台日志中执行
BACTION()
,手动推送一个值到streamB
(这有助于分析代码)。This solution will work when the observable is hot (and without
refCount
):.takeUntil(streamB)
: make streamA
complete upon streamB
producing a value..skip(1)
: make streamA
skip one value upon starting (or as a result of.repeat()
)..repeat()
: make streamA
repeat (reconnect) indefinitely..merge(streamA.take(1))
: offset the effect of.skip(1)
at the beginning of the stream.Example of making A stream skip every 5 seconds:
You can also use this sandbox http://jsbin.com/gijorid/4/edit?js,console to execute
BACTION()
in the console log at the time of running the code to manually push a value tostreamB
(which is helpful for analysing the code).