2015-10-24 12 views
71

मुझे लगता है कि मुझे कुछ मौलिक गलत समझना चाहिए, क्योंकि मेरे दिमाग में यह एक अवलोकन के लिए सबसे बुनियादी मामला होना चाहिए, लेकिन मेरे जीवन के लिए मैं यह नहीं समझ सकता कि दस्तावेज़ों से इसे कैसे किया जाए।आरएक्सजेएस: मैं एक पर्यवेक्षक को "मैन्युअल रूप से" कैसे अपडेट करूं?

असल में, मैं यह करने के सक्षम होना चाहते हैं:

// 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') उपयोग कर रहा था, लेकिन वह वास्तव में काम करने के लिए और कहा कि पर्यवेक्षक, जो सही नहीं लगता है पर कहा जाता है नहीं मालूम था। पर्यवेक्षक डेटा स्ट्रीम पर प्रतिक्रिया करने वाली चीज होनी चाहिए, इसे बदल नहीं, है ना?

क्या मैं पर्यवेक्षक/देखने योग्य रिश्ते को समझ नहीं पा रहा हूं?

+0

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

+0

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

+0

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

उत्तर

88

आरएक्स में, पर्यवेक्षक और पर्यवेक्षक अलग-अलग संस्थाएं हैं। एक पर्यवेक्षक एक पर्यवेक्षक की सदस्यता लेता है। एक पर्यवेक्षक पर्यवेक्षकों के तरीकों को बुलाकर अपने पर्यवेक्षकों को वस्तुओं को उत्सर्जित करता है। यदि आपको 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

यह वास्तव में वही है जो मैं कर रहा था! मैंने यह देखने के लिए काम किया कि क्या मुझे ऐसा करने का बेहतर तरीका मिल सकता है, लेकिन यह निश्चित रूप से एक व्यवहार्य समाधान है।मैंने इसे पहले इस आलेख में देखा: http://aaronstacy.com/writings/reactive-programming-and-mvc/। – LiamD

+22

बस एक नोट .. पर अगला फ़ंक्शन का नाम बदलकर 'अगली' –

14

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

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 है।

+0

को ओवरराइट करने की संभावना है emitter प्रॉपर्टी को आरएक्सजेएस मैनुअल पर कहीं भी दस्तावेज किया गया है? – Tomas

संबंधित मुद्दे

 संबंधित मुद्दे