有可能以某种方式重复扼杀培根行动吗?

时间:2013-09-28 16:23:09

标签: javascript functional-programming frp bacon.js

我正在使用bacon.js并且在某些情况下从两个来源发出信号:

sourceA :: EventStream a
sourceB :: EventStream Bool

sourceA被触发时,除了从repeatedly发出信号之外,它应该触发一些永久运行sourceB的动作。从语法上讲,它可能看起来像这样:

aAction = sourceA
    . repeatedly (200, [1,2,3])
    . until      (sourceB)

所以我基本上要求对takeWhiletakeUntil组合器进行模拟,但是在源代码或文档中找不到这样的函数。有什么想法吗?

如果有一个通用的组合器,那就更好了

throttleWhen :: Bool -> EventStream a

throttleWhen' :: EventStream Bool -> EventStream a

在某些条件下终止任何培根事件流,我将如何实现这样的事情?

请注意,此解决方案如下:

faAction = sourceA  . repeatedly (200, [1,2,3])
aAction  = faAction . takeUntil  (sourceB) 

限制派生流aAction,但不限制原始流{{1}}。

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}}
相关问题