【问题标题】:How can I combine a current value of a stream with each value of another stream in bacon.js?如何将流的当前值与 bacon.js 中另一个流的每个值结合起来?
【发布时间】:2014-01-21 14:35:07
【问题描述】:

在我的应用程序中,我有一个状态对象state,它被 GUI 元素改变了。每次改变这个状态时,都会执行一个 XHR 来更新服务器端的状态并返回当前状态。这很好地映射到 Bacon.js 的流。

现在,假设一个突变流mutationEventStream,我正在尝试通过将先前的状态值与事件触发器组合来更新我的状态:

Bacon.onValues(state, mutationEventStream, function(data, event) {
    dataUpdateBus.push(/* extract data from event */)
})

dataUpdateBus包含所有需要去服务器的数据更新。state是由dataUpdateBus上的数据发起的XHR返回的)

我现在的问题是我需要一个当前状态值来正确更新它。如果我有一个全局变量,我只需要 mutationEventStream 上的新事件,但是对于流,我需要混合我的 state 流。使用上面的代码,我得到了state 的每次更新,即数据更新实际上是一个无限循环(dataUpdateBus.push -> XHR -> state -> dataUpdateBus.push 等)。而且由于state 的更新频率比mutationEventStream 更频繁,所以我不能使用Bacon.zip()

我做错了什么,我可以做得更好?

【问题讨论】:

    标签: javascript reactive-programming bacon.js


    【解决方案1】:

    如果我理解正确,您希望将 mutationStream 中的每个新值与 state 的当前值结合起来,但您不想在 时触发更新>state 变化(导致“反馈”效果)。 sampledBy 组合器允许使用这样做:

    var stateUpdates = state.sampledBy(mutationStream, function(currentState, newEvent) {
      return currentState.updatedWith(newEvent)
    }).onValue(dataUpdateBus.push)
    

    与您的代码的主要区别在于,仅在 mutationStream 中的新事件上生成更新。

    【讨论】:

    • 所以那是介于onValueszip 之间的中间地带!效果很好,正如您所期望的那样。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多