如何将流的当前值与bacon.js中另一个流的每个值组合?

时间:2014-01-21 14:35:08

标签: javascript reactive-programming bacon.js

在我的应用程序中,我有一个状态对象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 - > {{1等等)。由于dataUpdateBus.push的更新频率高于state,因此我无法使用mutationEventStream

我做错了什么,我能做得更好?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望将 mutationStream 中的每个新值与 state 的当前值组合,但是您不希望在状态更改(导致“反馈”效果)。 sampledBy 组合器允许使用这样做:

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

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