2014-01-21 2 views
1

내 응용 프로그램에서 GUI 요소에 의해 변형 된 state 상태 개체가 있습니다. 이 상태가 변경 될 때마다 XHR이 실행되어 서버 측을 업데이트하고 현재 상태가 반환됩니다. 이것은 Bacon.js의 스트림에 잘 매핑됩니다.스트림의 현재 값을 bacon.js의 다른 스트림의 각 값과 결합하려면 어떻게해야합니까?

지금, 돌연변이 스트림 mutationEventStream 가정, 나는 이벤트 트리거와 이전 상태 값을 결합하여 내 상태를 업데이트하기 위해 노력하고있어 :

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

(dataUpdateBus 서버를 이동하는 데 필요한 모든 데이터 업데이트가 포함되어 있습니다. statedataUpdateBus에있는 데이터로 시작된 XHR에서 반환 한 것입니다.

문제를 올바르게 업데이트하려면 현재 상태 값이 필요합니다. 전역 변수가있는 경우 mutationEventStream에 새 이벤트 만 필요하지만 스트림을 사용하면 내 state 스트림을 믹싱해야합니다. 위의 코드를 사용하면 데이터 업데이트로 state의 모든 업데이트를 받고 있습니다. 즉, 무한 루프 (dataUpdateBus.push -> XHR ->state ->dataUpdateBus.push 등)입니다. statemutationEventStream보다 자주 업데이트되므로 Bacon.zip()을 사용할 수 없습니다.

내가 뭘 잘못하고 있으며 더 잘할 수 있습니까? 내가 제대로 이해하면

답변

1

, 당신은 상태의 현재 값과 에 mutationStream을 각각의 새로운 값을 결합하려는, 그러나 당신은 업데이트를 실행하지 않으려는 경우 상태 변경 (즉, "피드백"을 원인 효과).

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

코드에 키 차이가 업데이트 만 mutationStream에서 새로운 이벤트 생성되는 경우 : sampledBy 콤비는이 작업을 수행하는 데 사용할 수 있습니다.

+0

그래서 * onValues와 zip 사이의 중간 지점입니다! 예상대로 훌륭하게 작동합니다. 감사! –