2012-08-29 14 views
6

RxJSには次のようなソリューションはありますか? Is it possible to invoke subscribers's OnNexts on different threads in Rx?Observable.IntervalのRxJS複数のサブスクリプション

P.S. (CoffeeScriptの中に)私の最初の、単純なアプローチは明らかに失敗していた:

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

第二のサブスクリプションは、35秒間隔のために何も返さない、とそう

答えて

5

.selectは機能ではなく、値を期待しています。以下の作品:あなたは通常、あなたは一度だけ、それを呼び出す、二回connect()を呼び出す必要はありません

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

注意してください。観察可能なチェーンの最後に.publish().refCount()を呼び出すことによって "自動" connect()を使用する方が良いです。それはConnectableObservableを作成します。言い換えれば、「熱心に観察可能」です(https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables参照)。この場合、私たちは熱い観測を必要としませんでした。 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/

関連する問題