我正在使用bacon.js,并且有两种情况,信号是从两个源发出的:
sourceA :: EventStream a
sourceB :: EventStream Bool
触发
sourceA
时,它应触发一些使repeatedly
永久运行的动作,除非从sourceB
触发信号。因此,在语法上可能看起来像这样:aAction = sourceA
. repeatedly (200, [1,2,3])
. until (sourceB)
因此,我基本上是在要求
takeWhile
或takeUntil
组合器的类似物,但在源代码或文档中找不到这样的功能。有什么想法吗?如果有通用的组合器会更好
throttleWhen :: Bool -> EventStream a
要么
throttleWhen' :: EventStream Bool -> EventStream a
在某种情况下终止了任何培根事件流,我将如何实现这样的事情?
注意,此解决方案如下:
faAction = sourceA . repeatedly (200, [1,2,3])
aAction = faAction . takeUntil (sourceB)
限制派生的流
aAction
,而不限制原始流。 最佳答案
如果我理解正确,那么您正在寻找当真值出现在另一个流中时结束该流的组合器。当真实值出现在a.takeUntil(b.filter(Bacon._.id))
上时,可以使用b
结束流。如果b
是属性,则如果b
开始时具有真实值,则结果将立即结束。
您的解决方案可能看起来像这样。
aAction = sourceA
.flatMap(function() {
return Bacon.repeatedly (200, [1,2,3])
.takeUntil(sourceB.filter(Bacon._.id))
})
这将为
sourceA
的每个元素启动一个新流,并在出现真实值sourceB
时终止该流。或者,如果
a.takeWhile(b.not())
是属性,则可以b
。如果Property以真实值开头,则立即结束。因此,如果
sourceB
是持有true / false的属性,并且您只想在持有false
时才发出值,则可以aAction = sourceA
.flatMap(function() {
return Bacon.repeatedly (200, [1,2,3])
.takeWhile(sourceB.not())
})
关于javascript - 是否有可能以某种方式“反复”抑制培根的 Action ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19069032/