我正在使用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
,但不限制原始流{{1}}。
答案 0 :(得分:2)
如果我理解正确的话,你正在寻找一个组合器,当一个truthy值出现在另一个流中时,该组合器结束一个流。当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
是属性,则可以sourceB
。如果Property有一个真正的值,则立即结束。
因此,如果false
是一个包含true / false的Property,并且您希望仅在它保持aAction = sourceA
.flatMap(function() {
return Bacon.repeatedly (200, [1,2,3])
.takeWhile(sourceB.not())
})
时才发出值,则可以
{{1}}