2015-09-27 14 views
5

मैं आरएक्सजेएस पुस्तकालय सीखने की कोशिश कर रहा हूं। जिन मामलों में मुझे काफी समझ नहीं आती है उनमें से एक को this jsfiddle (नीचे कोड भी) में वर्णित किया गया है।आरएक्सजेएस गठबंधन नवीनतम: केवल एक मूल्य परिवर्तन के बाद उत्सर्जन कैसे प्राप्त करें?

var A= new Rx.Subject(); 
var B= new Rx.Subject(); 

A.onNext(0);  

// '.combineLatest' needs all the dependency Observables to get emitted, before its combined signal is emitted. 
// 
// How to have a combined signal emitted when any of the dependencies change (using earlier given values for the rest)? 
//  
A.combineLatest(B, function (a,b) { return a+b; }) 
.subscribe(function (v) { console.log("AB: "+ v); }); 

B.onNext("a"); 
A.onNext(1); 

मैं "एबी" लॉगिंग में दो उत्सर्जन प्राप्त करना चाहता हूं। बी को "ए" में बदलने से एक (पहले से ही मान 0 है)। ए को बदलने के लिए एक और 1.

हालांकि, सब्सक्राइब के बाद होने वाले केवल परिवर्तन ही मायने रखते हैं (भले ही ए के पास मूल्य है और इस प्रकार संयुक्त परिणाम की गणना की जा सकती है)।

क्या मुझे इसके लिए "गर्म अवलोकन" का उपयोग करना चाहिए, या .combineLatest से कुछ अन्य विधि का उपयोग करना चाहिए?

वास्तविक कोड (इस नमूने से बड़ा) में मेरी समस्या यह है कि मुझे सदस्यता के बाद अलग-अलग प्रारंभिकरण करने की आवश्यकता है, जो शुरुआती मूल्यों को स्पष्ट रूप से सामने रखने के बजाय दो अलग-अलग स्थानों में सामग्री को काटता है।

धन्यवाद

उत्तर

9

मैं तुम्हें गलत समझा है कैसे Subjects काम लगता है। Subjects गर्म पर्यवेक्षण हैं। वे मूल्यों पर निर्भर नहीं हैं, इसलिए यदि उन्हें onNext प्राप्त होता है, तो कोई भी ग्राहक इस मूल्य के मुकाबले दुनिया में खो जाएगा।

जो आप खोज रहे हैं वह BehaviorSubject या ReplaySubject दोनों है जो दोनों पिछले मूल्यों पर हैं जो उन्हें नए ग्राहकों को फिर से छोड़ देते हैं। पूर्व मामले में आप हमेशा एक प्रारंभिक मूल्य

//All subscribers will receive 0 
var subject = new Rx.BehaviorSubject(0); 

//All subscribers will receive 1 
//Including all future subscribers 
subject.onNext(1); 
बाद आप मूल्यों की संख्या निर्धारित में

साथ यह निर्माण प्रत्येक सदस्यता

var subject = new Rx.ReplaySubject(1); 
//All new subscribers will receive 0 until the subject receives its 
//next onNext call 
subject.onNext(0); 

अपने उदाहरण नए सिरे से लिखना यह हो सकता है के लिए पुनः बजाया जाना चाहिए:

var A= new Rx.BehaviorSubject(0); 
var B= new Rx.Subject();  

// '.combineLatest' needs all the dependency Observables to get emitted, before its combined signal is emitted. 
// 
// How to have a combined signal emitted when any of the dependencies change (using earlier given values for the rest)? 
//  
A.combineLatest(B, function (a,b) { return a+b; }) 
.subscribe(function (v) { console.log("AB: "+ v); }); 

B.onNext("a"); 
A.onNext(1); 

//AB: 0a 
//AB: 1a 

एक और नोट पर, यह सुनिश्चित करने के लिए कि यह आपके लिए बिल्कुल नया है, ज्यादातर मामलों में आपको सीधे Subject का उपयोग करने की आवश्यकता नहीं है क्योंकि यह आमतौर पर मी एनएस कि आप अपने ज्ञात प्रतिमानों की सुरक्षा में आरएक्स को झुकाव करने की कोशिश कर रहे हैं। आपको खुद से पूछना चाहिए, आपका डेटा कहां से आ रहा है? यह कैसे बनाया जा रहा है? यदि आप उन प्रश्नों को पर्याप्त रूप से पूछते हैं, तो स्रोतों पर आपकी घटनाओं की श्रृंखला का पालन करने के बाद, 10 बार में से 9 बार आप पाएंगे कि इसके लिए शायद Observable रैपर है।

+0

बहुत अच्छा जवाब पॉल, धन्यवाद! व्यवहार विषय वास्तव में मेरे लिए काम करता है, और मैं आपके द्वारा लिखे गए अंतिम पैराग्राफ का महत्व देता हूं। मुझे यकीन है कि आप सही हैं। मेरे मूल्य माउस ड्रैग से हैं; आरएक्स दस्तावेज के साथ इसे और अधिक समझने के लिए आगे बढ़ेगा। – akauppi

+1

@akauppi yep mouse drags निश्चित रूप से देखने योग्य घटनाएं हैं, [fromEvent] (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromevent.md) देखें। जब आप अधिक आरएक्स अनुभव प्राप्त करते हैं, तो आप पूर्ण रूप से 'विषयों के साथ सीधे काम करने की आवश्यकता के बिना केवल आरएक्स ऑपरेटरों का उपयोग करके अपने अंतिम अवलोकन योग्य परिणाम के लिए अवलोकन करने योग्य माउस ईवेंट के स्रोत से सभी को एक साथ कैसे स्ट्रिंग करना सीख सकते हैं। '। – Brandon

+0

@ ब्रैंडन मैं अभी आरएक्स सीख रहा हूं। :) आखिर में आरएक्सजे के साथ एसवीजी के संयोजन के साथ मेरा प्रयोग सार्वजनिक कर देगा (सोचने वाली वस्तुओं को एकसाथ सोचें)। – akauppi

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