Saya pikir saya pasti salah paham tentang sesuatu yang fundamental, karena dalam pikiran saya ini harus menjadi kasus paling mendasar untuk diamati, tetapi untuk kehidupan saya, saya tidak tahu bagaimana melakukannya dari dokumen.
Pada dasarnya, saya ingin bisa melakukan ini:
// 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
}
Tapi saya belum bisa menemukan metode seperti itu push
. Saya menggunakan ini untuk click handler, dan saya tahu mereka memilikinya Observable.fromEvent
, tetapi saya mencoba menggunakannya dengan React dan saya lebih suka dapat memperbarui datastream dalam callback, daripada menggunakan yang sama sekali berbeda sistem penanganan acara. Jadi pada dasarnya saya menginginkan ini:
$( "#target" ).click(function(e) {
eventObservable.push(e.target.text());
});
Yang paling dekat yang saya dapatkan adalah menggunakan observer.onNext('foo')
, tetapi itu tampaknya tidak benar-benar berfungsi dan itu disebut pengamat, yang tampaknya tidak benar. Pengamat seharusnya yang bereaksi terhadap aliran data, bukan mengubahnya, bukan?
Apakah saya hanya tidak memahami hubungan pengamat / yang dapat diamati?
sumber
Jawaban:
Di RX, Observer dan Observable adalah entitas yang berbeda. Seorang pengamat berlangganan Observable. Sebuah Observable memancarkan item ke pengamatnya dengan memanggil metode pengamat. Jika Anda perlu memanggil metode pengamat di luar ruang lingkup
Observable.create()
Anda dapat menggunakan Subjek, yang merupakan proxy yang bertindak sebagai pengamat dan dapat diamati pada saat yang sama.Anda bisa melakukan seperti ini:
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'); }
Anda dapat menemukan informasi lebih lanjut tentang subjek di sini:
sumber
Saya percaya
Observable.create()
tidak mengambil pengamat sebagai param panggilan balik tetapi emitor. Jadi jika Anda ingin menambahkan nilai baru ke Observable Anda, coba ini sebagai gantinya: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"
Ya, Subjek membuatnya lebih mudah, menyediakan Observable dan Observer dalam objek yang sama, tetapi tidak persis sama, karena Subjek memungkinkan Anda untuk mendaftarkan beberapa pengamat ke observable yang sama ketika sebuah observable hanya mengirim data ke pengamat berlangganan terakhir, jadi gunakan secara sadar . Ini JsBin jika Anda ingin mengotak- atiknya .
sumber
emitter
hanyanext()
nilai baru untuk pengamat yang berlangganan terakhir. Pendekatan yang lebih baik adalah mengumpulkan semuaemitter
dalam sebuah array dan mengulanginya semua dannext
nilai masing-masing