Javascript 有没有可能以某种方式“反复”扼杀培根的行动?

Javascript 有没有可能以某种方式“反复”扼杀培根的行动?,javascript,functional-programming,frp,bacon.js,Javascript,Functional Programming,Frp,Bacon.js,我使用的是bacon.js,在某些情况下,信号是从两个源发出的: sourceA :: EventStream a sourceB :: EventStream Bool 当触发sourceA时,它应该触发一些动作,这些动作在永久性上重复运行,除非从sourceB触发信号。所以从语法上看可能是这样的: aAction = sourceA . repeatedly (200, [1,2,3]) . until (sourceB) 因此,我基本上要求使用类似于takeW

我使用的是bacon.js,在某些情况下,信号是从两个源发出的:

sourceA :: EventStream a
sourceB :: EventStream Bool
当触发
sourceA
时,它应该触发一些动作,这些动作在永久性上重复运行
,除非从
sourceB
触发信号。所以从语法上看可能是这样的:

aAction = sourceA
    . repeatedly (200, [1,2,3])
    . until      (sourceB)
因此,我基本上要求使用类似于
takeWhile
takeUntil
组合器的函数,但在源代码或文档中找不到这样的函数。有什么想法吗

如果有一个通用的组合词就更好了

throttleWhen :: Bool -> EventStream a

如果在某种条件下终止任何bacon事件流,我将如何实现这样的事情

注意,此解决方案如下所示:

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

限制派生流
aaaction
,但不限制原始流

如果我理解正确,那么您正在寻找一个组合器,它在另一个流中出现真实值时结束一个流。当真实值出现在
b
上时,您可以使用
a.takeUntil(b.filter(Bacon.\uu.id))
结束流。如果
b
是一个属性,那么如果
b
在开始时持有真实值,结果将立即结束

你的解决方案可能是这样的

aAction = sourceA
  .flatMap(function() { 
    return Bacon.repeatedly (200, [1,2,3]) 
      .takeUntil(sourceB.filter(Bacon._.id))
  })
这将为
sourceA
的每个元素启动一个新流,并在出现truthy值
sourceB
时终止该流

或者,如果
b
是属性,则可以
a.takeWhile(b.not())
。如果属性以真实值开头,则立即结束

因此,如果
sourceB
是一个包含true/false的属性,并且您希望仅在它包含
false
时才发送值,那么您可以

aAction = sourceA
  .flatMap(function() { 
    return Bacon.repeatedly (200, [1,2,3]) 
      .takeWhile(sourceB.not())
  })

我想我对培根在这里的实施在概念和知识上有所欠缺。
Bacon.反复(200,[1..3])
是一个惰性地生成无限价值流的动作吗?因此,在您的示例中,一旦动作
takeUntil(…)
不再请求值,则
Bacon将不再生成更多值。重复
?您是正确的。Bacon中的所有生成器函数确实都是惰性的,而且所有流数据源都应该是惰性的,因此流用户不必关心资源管理。培根负责根据需求自动分配资源。
aAction = sourceA
  .flatMap(function() { 
    return Bacon.repeatedly (200, [1,2,3]) 
      .takeWhile(sourceB.not())
  })