2012-08-29 24 views
6

Czy istnieje jakieś rozwiązanie, takie jak następujące dla RxJS? Is it possible to invoke subscribers's OnNexts on different threads in Rx?RxJS wielu subskrypcji dla Observable.Interval

P.S. Mój pierwszy, naiwne podejście (w coffeescript) najwyraźniej nie powiodło się:

hObs = Rx.Observable.interval(35000) 
    .startWith(-1) 
    .select(moment().format("D MMMM, HH:mm:ss")) 
    .publish() 

hObs.subscribe((x)->console.log(x)) 
hObs.connect() 
hObs.subscribe((x)->console.log(x, 1)) 
hObs.connect() 

Druga subskrypcja zwraca nic dla przedziału 35s, i tak dalej

Odpowiedz

5

The .select oczekuje funkcji, a nie wartość. Następujące prace:

(function() { 
    var list = document.getElementById("list"); 
    var stream = Rx.Observable.interval(35000) 
    .startWith(-1) 
    .select(function(){ return moment().format("D MMMM, HH:mm:ss") }); 

    stream.subscribe(function(value) { 
     var li = document.createElement("li"); 
     li.innerHTML = "subscriber 1: "+value; 
     list.appendChild(li); 
    });  
    stream.subscribe(function(value) { 
     var li = document.createElement("li"); 
     li.innerHTML = "subscriber 2: "+value; 
     list.appendChild(li); 
    }); 
})(); 

http://jsfiddle.net/9EjSQ/43/

Zauważ, że nie trzeba zadzwonić connect() dwa razy, zazwyczaj to nazwać tylko raz. Lepiej jest użyć "automatycznego" connect(), wywołując .publish().refCount() na końcu obserwowalnego łańcucha. W ten sposób powstanie ConnectableObservable, innymi słowy "gorący obserwowalny" (patrz https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables). W tym przypadku nie potrzebowaliśmy gorącej obserwowalnej.

W coffeescript:

list = document.getElementById("list") 
stream = Rx.Observable.interval(35000) 
.startWith(-1) 
.select(-> moment().format("D MMMM, HH:mm:ss")) 

stream.subscribe((value) -> 
    li = document.createElement("li") 
    li.innerHTML = "subscriber 1: " + value 
    list.appendChild(li) 
) 
stream.subscribe((value) -> 
    li = document.createElement("li") 
    li.innerHTML = "subscriber 2: " + value 
    list.appendChild(li) 
) 

http://jsfiddle.net/9EjSQ/44/