1

我正在使用 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,但不限制原始流。

4

1 回答 1

2

如果我理解正确,您正在寻找一个组合器,当一个真实值出现在另一个流中时,它会结束一个流。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())ifb是一个属性。如果 Property 有一个真实值开始,则立即结束。

因此,如果sourceB是一个持有 true/false 的属性,并且您希望仅在它持有时才发出值false,您可以

aAction = sourceA
  .flatMap(function() { 
    return Bacon.repeatedly (200, [1,2,3]) 
      .takeWhile(sourceB.not())
  })
于 2013-09-29T05:54:55.410 回答