2012-08-29 16 views
6

¿Existe alguna solución como la siguiente para RxJS? Is it possible to invoke subscribers's OnNexts on different threads in Rx?Suscripciones múltiples RxJS para Observable.Interval

P.S. Mi primer acercamiento, ingenuo (en CoffeeScript), obviamente, había fracasado:

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

Segunda suscripción devuelve nada para el intervalo de 35 años, y así sucesivamente

Respuesta

5

El .select espera una función y no un valor. Las siguientes obras:

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

en cuenta que no es necesario llamar a connect() dos veces, normalmente se llama sólo una vez. Es mejor usar "automático" connect() llamando al .publish().refCount() al final de la cadena observable. Eso crearía un ConnectableObservable, en otras palabras, un "observable caliente" (ver https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables). En este caso, no necesitamos una observación caliente.

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

Cuestiones relacionadas