RxJS:オブザーバブルを「手動で」どのように更新しますか?


139

私は心の中でこれがオブザーバブルの最も基本的なケースになるはずなので、私は何かを根本的に誤解しているに違いないと思いますが、私の人生では、ドキュメントからそれを行う方法を理解できません。

基本的に、私はこれを行うことができるようにしたいです:

// create a dummy observable, which I would update manually
var eventObservable = rx.Observable.create(function(observer){});
var observer = eventObservable.subscribe(
   function(x){
     console.log('next: ' + x);
   }
...
var my_function = function(){
  eventObservable.push('foo'); 
  //'push' adds an event to the datastream, the observer gets it and prints 
  // next: foo
}

しかし、私はのような方法を見つけることができませんでしたpush。私はこれをクリックハンドラーに使用していますが、それらはそれを持っObservable.fromEventていることを知っていますが、Reactで使用しようとしていますが、完全に異なるものを使用するのではなく、コールバックでデータストリームを更新するだけで済みますイベント処理システム。だから基本的にこれが欲しい:

$( "#target" ).click(function(e) {
  eventObservable.push(e.target.text()); 
});

私が得た最も近いものはを使用observer.onNext('foo')していましたが、実際には機能していないようで、オブザーバーに呼び出されましたが、これは正しくありません。オブザーバーは、データストリームを変更するのではなく、データストリームに反応するものでなければなりません。

オブザーバーとオブザーバブルの関係を理解し​​ていないだけですか?


あなたの考えを明確にするためにこれを見てください(あなたが見失っていたリアクティブプログラミングの紹介):gist.github.com/staltz/868e7e9bc2a7b8c1f754。ここにも、理解を深めることができるリソースがたくさんあります:github.com/Reactive-Extensions/RxJS#resources
user3743222 '25

私は最初にチェックアウトしましたが、確かなリソースのようです。2つ目はすばらしいリストです。その上で、aaronstacy.com / writings / reactive-programming-and-mvcが見つかりましたこれは、Rx.Subjectの発見に役立ち、問題を解決しました。ほんとありがと!もう少しアプリを作成したら、自分のソリューションを投稿します。少しテストしてみましょう。
LiamD 2015年

へへ、この質問をしていただきありがとうございます。まったく同じコードサンプルを念頭に置いて、まったく同じ質問をしようとしました:-)
arturh

回答:


154

RXでは、ObserverとObservableは別個のエンティティです。オブザーバーはObservableにサブスクライブします。Observableは、オブザーバーのメソッドを呼び出すことによってオブザーバーにアイテムを発行します。スコープ外でオブザーバーメソッドを呼び出す必要Observable.create()がある場合は、サブジェクトを使用できます。これは、オブザーバーとして機能し、同時にObservableとして機能するプロキシです。

あなたはこのようにすることができます:

var eventStream = new Rx.Subject();

var subscription = eventStream.subscribe(
   function (x) {
        console.log('Next: ' + x);
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
    });

var my_function = function() {
  eventStream.next('foo'); 
}

あなたはここで主題についてのより多くの情報を見つけることができます:


1
これは、まさに私がやったことです!私は自分がやるべきことを行うためのより良い方法を見つけることができるかどうかを確認するために引き続き取り組みましたが、これは確かに実行可能な解決策です。この記事で最初に目にしたのは、aaronstacy.com / writings / reactive-programming-and-mvcです。
LiamD、2015年

34

私はオブザーバーをコールバックパラメーターとしてでObservable.create()はなく、エミッターと見なしています。したがって、Observableに新しい値を追加する場合は、代わりにこれを試してください。

var emitter;
var observable = Rx.Observable.create(e => emitter = e);
var observer = {
  next: function(next) {
    console.log(next);
  },
  error: function(error) {
    console.log(error);
  },
  complete: function() {
    console.log("done");
  }
}
observable.subscribe(observer);
emitter.next('foo');
emitter.next('bar');
emitter.next('baz');
emitter.complete();

//console output
//"foo"
//"bar"
//"baz"
//"done"

はい、サブジェクトを使用すると、オブザーバブルを最後のサブスクライブしたオブザーバーにのみデータを送信する場合、サブジェクトを使用して複数のオブザーバーを同じオブザーバブルにサブスクライブできるため、サブジェクトを使用すると、オブザーバブルとオブザーバーを同じオブジェクトで簡単に作成できます。 。これをいじくり回したい場合は、JsBinを以下に示します。


エミッタのプロパティを上書きする可能性はRxJSのマニュアルのどこかに記載されていますか?
トーマス

この場合、最後にサブスクライブしたオブザーバーの新しい値emitterのみになりnext()ます。より良いアプローチはemitter、配列内のすべてのを収集し、それらすべてとnextそれらのそれぞれの値を反復処理することです
Eric Gopak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.