Javascript 有没有可能以某种方式“反复”扼杀培根的行动?
我使用的是bacon.js,在某些情况下,信号是从两个源发出的: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
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())
})