6

RxJSの次のような解決策はありますか? Rx の異なるスレッドでサブスクライバーの OnNexts を呼び出すことは可能ですか?

PS私の最初の素朴なアプローチ(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() 

2 番目のサブスクリプションは 35 秒間何も返さない、など

4

1 に答える 1

5

.select値ではなく関数を期待します。以下の作品:

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

2 回呼び出す必要はありませんconnect()。通常は 1 回だけ呼び出します。オブザーバブル チェーンの最後でconnect()呼び出して「自動」を使用することをお勧めします。.publish().refCount()これにより、ConnectableObservable、つまり「ホット オブザーバブル」が作成されます ( https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observablesを参照) 。 . この場合、ホット オブザーバブルは必要ありませんでした。

コーヒースクリプトで:

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/

于 2014-05-23T20:14:46.863 に答える