在我的应用程序中,我有一个状态对象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
。
我做错了什么,我能做得更好?
答案 0 :(得分:1)
如果我理解正确,您希望将 mutationStream 中的每个新值与 state 的当前值组合,但是您不希望在状态更改(导致“反馈”效果)。 sampledBy 组合器允许使用这样做:
var stateUpdates = state.sampledBy(mutationStream, function(currentState, newEvent) {
return currentState.updatedWith(newEvent)
}).onValue(dataUpdateBus.push)
您的代码的主要区别在于,只会在 mutationStream 中的新事件上生成更新。