【问题标题】:Ignore past values from FRP event stream忽略 FRP 事件流中的过去值
【发布时间】:2014-07-02 02:30:44
【问题描述】:

我正在使用BaconJS 创建两个这样的事件流:

# Wait for start of the module
sStart = Bacon.fromCallback module.onStart.bind(module)
# Watch game ticks
sTick = Bacon.fromEventTarget emitter, 'tick'
# Combine it to do something
Bacon.onValues sStart, sTick, ->
    # Do something on each tick, but only when module has been started

我想用它来同步。一旦模块启动,它应该开始监听滴答声,而不是更早。它几乎可以工作,但是对于在模块启动之前发出的所有过去的滴答声都会调用回调,而不仅仅是最近的滴答声。比我希望为每个后续滴答调用该回调。

我几乎从 FRP 开始,可能有一些优雅的方法来处理它,但我现在看不到它。有什么想法吗?

【问题讨论】:

    标签: javascript frp bacon.js


    【解决方案1】:

    您可以像这里一样使用skipUntil 跳过值。

    startE = Bacon.fromCallback module.onStart.bind(module)
    tickE = Bacon.fromEventTarget emitter, 'tick'
    tickE.skipUntil(startE).onValue (tickValue) -> console.log tickValue
    

    上面的flatMap 解决方案也有效,但我发现skipUntil 更容易阅读。

    【讨论】:

    • 这看起来也很棒,也许它比flatMap 更具可读性。似乎我应该等待更长的时间来标记答案。我更喜欢这个。
    【解决方案2】:

    看起来你在滥用Bacon.onValues,其目的是创建一个新的流。

    如果你想等待模块启动,只需在监听器启动时注册即可:

    sTick = Bacon.fromEventTarget emitter, 'tick'
    
    module.onStart ->
      # when module has been started
      sTick.onValue ->
        # Do something on each tick
    

    对于完全 FRP 样式,您可以使用 flatMap

    sStart = Bacon.fromCallback module.onStart.bind(module)
    # Watch game ticks
    sTick = Bacon.fromEventTarget emitter, 'tick'
    # Combine it to a new stream that is made from sTicks by each sStart event
    sTicksAfterStart = sStart.flatMap -> sTick
    sTickeafterStart.onValue ->
      # Do something on each tick
    

    【讨论】:

    • 同意,除了不创建新流的 onValue 方法的建议用途。原始问题中也没有使用 onValue。
    • 是的,第一个解决方案非常明显,但由于我使用该启动事件与其他一些事件同步,我认为最好也使用流,我想搭便车回调厄运。您使用flatMap 的解决方案效果很好。谢谢。
    • @raimohanska 我什至没有使用onValue,但onValues应该是像Bacon.combineAsArray(...).onValues()一样工作的简写。
    • @raimohanska:谢谢,错字。甚至没有任何Bacon.onValue...
    • @FredyC:您也可以使用flatMapLatest 或更类似于promise 的flatMapFirst,它们应该同样适用于单个start 事件。
    猜你喜欢
    • 2023-01-31
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多