RxJS: Gözlenebilir bir öğeyi nasıl “el ile” güncellerim?


139

Sanırım temel bir şeyi yanlış anlamam gerekiyor, çünkü bence bu gözlemlenebilir bir şey için en temel durum olmalı, ama benim hayatım için bunu dokümanlardan nasıl yapacağımı anlayamıyorum.

Temel olarak, bunu yapabilmek istiyorum:

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

Ama ben böyle bir yöntem bulamadım push. Bunu bir tıklama işleyicisi için kullanıyorum ve bunun için olduğunu biliyorum Observable.fromEvent, ancak React ile kullanmaya çalışıyorum ve tamamen farklı kullanmak yerine, bir geri aramada veri akışını güncellemeyi tercih ederim olay işleme sistemi. Yani temelde şunu istiyorum:

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

En yakın kullanıyordum observer.onNext('foo'), ama bu gerçekten işe yaramadı ve doğru görünmeyen gözlemciye çağrıldı. Gözlemci, veri akışına tepki veren, değiştirmeyen şey olmalı, değil mi?

Sadece gözlemci / gözlemlenebilir ilişkiyi anlamıyor muyum?


Fikrinizi açıklığa kavuşturmak için buna bir göz atın (Eksik olduğunuz Reaktif Programlamaya giriş): gist.github.com/staltz/868e7e9bc2a7b8c1f754 . Burada da anlayışınızı geliştirebileceğiniz bir sürü kaynak var: github.com/Reactive-Extensions/RxJS#resources
user3743222 25:05

İlkini kontrol ettim, sağlam bir kaynak gibi görünüyor. İkincisi harika bir liste, üzerinde sorunumu çözen Rx.Subject'i keşfetmeme yardımcı olan aaronstacy.com/writings/reactive-programming-and-mvc buldum . Çok teşekkürler! Biraz daha fazla uygulama yazdıktan sonra, çözümümü göndereceğim, sadece savaşmak için biraz test etmek istiyorum.
LiamD

Hehe, bu soruyu sorduğunuz için çok teşekkür ederim, aynı soruyu akılda tutarak aynı soruyu sormak
üzereydim

Yanıtlar:


154

RX'de Gözlemci ve Gözlemlenebilir ayrı varlıklardır. Bir gözlemci bir Gözlenebilir olana abone olur. Bir Gözlemlenebilir, gözlemcilerin yöntemlerini çağırarak öğelerini gözlemcilere yayar. Gözlemci yöntemlerini kapsamınızın dışında çağırmanız gerekiyorsa Observable.create(), aynı zamanda gözlemci ve Gözlenebilir olarak davranan bir proxy olan bir Konu kullanabilirsiniz.

Bunu şöyle yapabilirsiniz:

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'); 
}

Konular hakkında daha fazla bilgiyi burada bulabilirsiniz:


1
Aslında tam da bunu yaparken yaraladım! Yapmam gerekeni yapmanın daha iyi bir yolunu bulabileceğimi görmek için üzerinde çalışmaya devam ettim, ama bu kesinlikle uygulanabilir bir çözüm. İlk olarak bu makalede gördüm: aaronstacy.com/writings/reactive-programming-and-mvc .
LiamD

34

Observable.create()Bir gözlemciyi geri arama parametresi olarak değil, bir verici olarak kabul ettiğine inanıyorum . Dolayısıyla, Gözlenebilir öğenize yeni bir değer eklemek istiyorsanız bunun yerine şunu deneyin:

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"

Evet Konu, aynı nesnede Gözlenebilir ve Gözlemci sağlayarak bunu kolaylaştırır, ancak Özne, bir gözlemlenebilir yalnızca en son abone olunan gözlemciye veri gönderdiğinde aynı gözlemlenebilire birden fazla gözlemciyi abone etmenize izin verdiği için tam olarak aynı değildir, bu yüzden bilinçli olarak kullanın . Eğer onunla uğraşmak istiyorsanız işte bir JsBin .


emitör özelliği üzerine yazma olasılığı RxJS kılavuzlarında bir yerde belgelenmiştir?
Tomas

Bu durumda emitter, yalnızca next()sonuncusuna abone olan gözlemci için yeni değerler olacaktır . Daha iyi bir yaklaşım, tüm emitterdizileri bir dizide toplamak ve hepsini ve nexther birinin değerini tekrarlamaktır
Eric Gopak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.