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लिए है, लेकिन मैं इसे रिएक्ट के साथ उपयोग करने की कोशिश कर रहा हूं और मैं पूरी तरह से अलग उपयोग करने के बजाय कॉलबैक में डेटास्ट्रीम को अपडेट कर सकता हूं। ईवेंट हैंडलिंग सिस्टम। इसलिए मूल रूप से मैं यह चाहता हूं:

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

मुझे मिला निकटतम उपयोग कर रहा था observer.onNext('foo'), लेकिन यह वास्तव में काम नहीं करता था और इसे पर्यवेक्षक कहा जाता है, जो सही नहीं लगता है। पर्यवेक्षक को डेटा स्ट्रीम में प्रतिक्रिया करने वाली चीज़ होनी चाहिए, इसे बदलना नहीं, है ना?

क्या मैं सिर्फ प्रेक्षक / अवलोकनीय संबंध को नहीं समझता हूँ?


अपने विचार स्पष्ट करने के लिए इस पर एक नज़र डालें (रिएक्टिव प्रोग्रामिंग का परिचय जो आपको याद आ रहा है): gist.github.com/staltz/868e7e9bc2a7b8c1f754 । यहाँ भी संसाधनों का एक समूह है, जहाँ से आप अपनी समझ में सुधार कर सकते हैं: github.com/Reactive-Extensions/RxJS#resources
user3743222

मैंने पहले जाँच की, एक ठोस संसाधन की तरह लगता है। दूसरी एक महान सूची है, इस पर मैंने aaronstacy.com/writings/reactive-programming-and-mvc पाया जिसने मुझे Rx.Subject की खोज करने में मदद की, जो मेरी समस्या को हल करता है। तो धन्यवाद! एक बार जब मैंने थोड़ा और एप्लिकेशन लिख दिया तो मैं अपना समाधान पोस्ट करूंगा, बस इसे थोड़ा परीक्षण करना चाहता हूं।
LiamD

हे, इस सवाल को पूछने के लिए आपका बहुत-बहुत धन्यवाद, मैं बहुत ही समान प्रश्न को ध्यान में रखते हुए एक ही सवाल पूछने वाला था :-)
Arturh

जवाबों:


154

आरएक्स में, ऑब्जर्वर और ऑब्जर्वेबल अलग-अलग इकाइयां हैं। एक पर्यवेक्षक एक पर्यवेक्षक की सदस्यता लेता है। एक पर्यवेक्षक पर्यवेक्षकों के तरीकों को कॉल करके अपने पर्यवेक्षकों को आइटम उत्सर्जित करता है। यदि आपको पर्यवेक्षक विधियों को कॉल करने की आवश्यकता है, तो आप अपने कार्यक्षेत्र के बाहर Observable.create()एक विषय का उपयोग कर सकते हैं, जो एक प्रॉक्सी है जो एक ही समय में पर्यवेक्षक और अवलोकन योग्य के रूप में कार्य करता है।

आप इस तरह कर सकते हैं:

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
एलआईएमडी

34

मेरा मानना Observable.create()है कि कॉलबैक परम के रूप में एक पर्यवेक्षक नहीं लेता है, लेकिन एक एमिटर है। इसलिए यदि आप अपने ऑब्जर्वेबल के लिए एक नया मूल्य जोड़ना चाहते हैं, तो इसके बजाय यह प्रयास करें:

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"

हां सब्जेक्ट आसान बनाता है, ऑब्जर्वेबल और ऑब्जर्वर को एक ही ऑब्जेक्ट में प्रदान करता है, लेकिन यह बिल्कुल वैसा नहीं है, क्योंकि सब्जेक्ट आपको एक ही ऑब्जर्वेबल के लिए कई ऑब्जर्वर को सब्सक्राइब करने की अनुमति देता है, जब एक ऑब्जर्वेबल केवल आखिरी सबसर्वर ऑब्जर्वर को डेटा भेजता है, इसलिए इसे सचेत रूप से उपयोग करें । यहाँ एक JBBin है अगर आप इसके साथ टिंकर करना चाहते हैं।


क्या RxJS नियमावली पर एमिटर प्रॉपर्टी को ओवरराइट करने की संभावना है?
टॉमस

इस मामले में पर्यवेक्षक के लिए emitterकेवल next()नए मान होंगे जिन्होंने अंतिम सदस्यता ली थी। एक बेहतर दृष्टिकोण सभी emitterएस को एक सरणी में इकट्ठा करना और उन सभी के माध्यम से पुनरावृत्ति करना होगा और उनमें से nextप्रत्येक पर मान
एरिक गोपक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.