web-dev-qa-db-ja.com

RxJS:Observableを "手動で"更新するにはどうすればいいですか?

基本的なことを誤解しなければならないと思います、なぜなら私の頭の中ではこれは観測可能なもののための最も基本的なケースであるべきですが、私の人生のために私はドキュメントからそれをする方法を理解できません。

基本的に、私はこれができるようになりたいです。

// 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')を使っていた、しかしそれは実際にはうまくいかないようで、それはオブザーバーで呼ばれて、それは正しくないようである。オブザーバは、データストリームに反応するもので、変更するのではなく、正しいものであるべきです。

観察者と観察可能な関係を理解し​​ていないだけですか?

114
LiamD

RXでは、ObserverとObservableは別々のエンティティです。オブザーバはオブザーバブルを購読します。オブザーバブルは、オブザーバのメソッドを呼び出すことによって、オブザーバにアイテムを放出します。 Observable.create()の範囲外のオブザーバメソッドを呼び出す必要がある場合は、Subjectを使用できます。これは、オブザーバと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'); 
}

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

131
luisgabriel

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"

Yes SubjectはObservableとObserverを同じオブジェクトで提供することでより簡単にしますが、Observableが最後に購読しているオブザーバにのみデータを送信する場合、Subjectは複数のオブザーバを同じオブザーバブルに購読することができます。 。これをいじってみたいのであれば、 JsBin です。

29