2013-09-06 2 views
0

combine3을 구현하는 쉬운 방법이 있습니까? 더미 onValue() 소비자가 존재하지 않는 combineWith 혼자 작동하지 않습니다.Bacon.js의 3 개 속성에 대해

var Bacon = require('baconjs') 

function emit(delay) 
{ 
     var s = new Bacon.Bus() 
     setTimeout(function() 
     { 
       console.log("emit", delay) 
       s.push(delay) 
     }, delay) 
     return s.toProperty() 
} 

var foo = emit(500) 
var bar = emit(1000) 
var baz = emit(1500) 

function consume(foo, bar, baz) 
{ 
     console.log("consumed", foo, bar, baz) 
} 

function combine3(consume, foo, bar, quux) 
{ 
     Bacon.combineWith(function (foo, bar, quux) 
     { 
       return { foo : foo, bar : bar, quux : quux } 
     }, foo, bar, quux) 
     .onValue(function (x) 
     { 
       consume(x.foo, x.bar, x.quux) 
     }) 
} 

combine3(consume, foo, bar, baz) 

참고 :

Bacon.combineWith(consume, foo, bar, baz).onValue(function() {}) 

해결 방법은 여전히 ​​해킹처럼 보인다. 다음 3 개 버전 consume()를 호출하지 않는다 : 손

Bacon.when([foo, bar, baz], consume) 
Bacon.update(911, [foo, bar, baz], consume) 
Bacon.zipWith(foo, bar, baz, consume) 

작업은 3 개 개의 매개 변수를 기반으로 HTML 테이블을 필터링하는 것입니다. 따라서 consume은 현재 선택된 필터링 조건을 기반으로 테이블을 그리고 새로운 Observables을 생성하지 않습니다.

또한 더 간단한 방법으로 emit()을 작성 하시겠습니까?

+0

것입니까? – raimohanska

+0

'combineWith'만으로는 작동하지 않습니다. 내 질문을 업데이트했습니다. – nponeccop

+0

emit()과 관련하여 Bacon.later()를 사용할 수 있습니다. – raimohanska

답변

3

그러면 combineWith 메서드는 기존 Observables (Properties 및 EventStreams)에서 새 Property를 만드는 데 사용됩니다. 모든 Observables는 게으르다. 즉, 하나 이상의 구독자가없는 경우 기본 소스에 등록하지 않아야합니다.

Observables의 구성 (결합, zip, when, update 등)을 부작용 할당, 즉 구독자 등록과 혼동해서는 안됩니다. Observable의 값에 대해 "소비"기능을 호출하려면 구독자로 등록해야합니다.

여전히 Bacon 이벤트에는 하나의 값만 포함되므로 onValue와 함께 N 진수 함수를 사용할 수 없다는 문제가 있습니다. 그러나 Observable에 배열을 값으로 포함하고 값 배열을 인수로 N 진수 함수로 분할하는 "onValues"메서드를 사용할 수 있습니다. 나는 당신이 N Observables은 결합과 가치에 N 진 기능을 적용 할 아주 일반적인 경우가 될 것으로 때문에

그래서,이 작업을 수행하는 한 가지 방법은

// Property that emits values as arrays of [foo, bar, baz] 
var combined = Bacon.combineAsArray(foo, bar, baz) 
// Assign side effect. Split value arrays to 3-ary function. 
combined.onValues(consume) 

이다, 속기 방법있다 이것에 대한 "Bacon.onValues". 그래서, 가장 간단한 대답은 combineWith이 combineN 무엇 내가 놓치고있는 N.위한 것 같다 나에게 단지

Bacon.onValues(foo, bar, baz, consume) 
+0

베이컨을보고있는 것이 너무 좋습니다 .js 태그! – nponeccop

+0

감사. 그 해답이 도움이되기를 바랍니다. – raimohanska