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

最佳答案

如果我理解正确,那么您正在寻找当真值出现在另一个流中时结束该流的组合器。当真实值出现在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/

10-15 11:14