2012-08-29 18 views
6

C'è qualche soluzione come seguirne una per RxJS? Is it possible to invoke subscribers's OnNexts on different threads in Rx?RxJS abbonamenti multipli per Observable.Interval

P.S. Il mio primo approccio ingenuo (in CoffeeScript) aveva evidentemente fallito:

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() 

secondo abbonamento ritorna nulla per intervallo di 35s, e così via

risposta

5

Il .select prevede una funzione, non un valore. Le seguenti opere:

(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/

Si noti che non è necessario chiamare connect() due volte, in genere lo si chiama solo una volta. È preferibile utilizzare "automatic" connect() chiamando .publish().refCount() alla fine della catena osservabile. Ciò creerebbe un ConnectableObservable, in altre parole un "osservabile caldo" (vedi https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables). In questo caso, non abbiamo avuto bisogno di un osservabile caldo.

In 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/