2017-02-03 6 views
6

मेरे पास मल्टीकास्टेड अवलोकन और एक अप्रत्याशित (मेरे लिए) व्यवहार के बारे में एक प्रश्न है, मैंने देखा।साझा किए गए अवलोकन और स्टार्टविथ ऑपरेटर

const a = Observable.fromEvent(someDom, 'click') 
    .map(e => 1) 
    .startWith(-1) 
    .share(); 

const b = a.pairwise(); 

a.subscribe(a => { 
    console.log(`Sub 1: ${a}`); 
}); 

a.subscribe(a => { 
    console.log(`Sub 2: ${a}`) 
}); 

b.subscribe(([prevA, curA]) => { 
    console.log(`Pairwise Sub: (${prevA}, ${curA})`); 
}); 

तो, एक साझा करने योग्य एक है, जो प्रत्येक क्लिक ईवेंट पर 1 उत्सर्जित करता है। -1 ऑपरेटर के साथ शुरुआत के कारण उत्सर्जित किया जाता है। अवलोकन योग्य बी सिर्फ एक से नवीनतम दो मूल्यों को जोड़कर एक नया अवलोकन योग्य बनाता है।

मेरे उम्मीद थी:

[-1, 1] // first click 
[ 1, 1] // all other clicks 

मैं क्या देखा था:

[1, 1] // from second click on, and all other clicks 

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

अब, मुझे पता है कि मैं BehaviourSubject के माध्यम से मल्टीकास्ट कर सकता हूं और स्टार्टविथ ऑपरेटर का उपयोग नहीं कर सकता, लेकिन जब मैं स्टार्टविथ और मल्टीकास्ट शेयर के माध्यम से उपयोग करता हूं तो मैं इस परिदृश्य के उपयोग के मामले को समझना चाहता हूं।

जहां तक ​​मैं समझता हूं, जब भी मैं .share() और .startWith (x) का उपयोग करता हूं, केवल एक ग्राहक को स्टार्ट के साथ अधिसूचित किया जाएगा, क्योंकि मूल्य के उत्सर्जन के बाद अन्य सभी सब्सक्राइबरों की सदस्यता ली जाती है।

तो क्या यह किसी विशेष विषय (व्यवहार/रीप्ले ...) के माध्यम से मल्टीकास्ट का कारण है या क्या मुझे इस शुरुआत के बारे में कुछ याद आ रहा है/साझा परिदृश्य?

धन्यवाद!

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है। क्या आप BehaviourSubject के साथ एक उदाहरण प्रदान कर सकते हैं? – Eselfar

उत्तर

7

यह वास्तव में सही व्यवहार है।

.startWith() प्रत्येक नए ग्राहक के लिए अपना मूल्य उत्सर्जित करता है, न केवल पहले। कारण b.subscribe(([prevA, curA]) कभी प्राप्त नहीं करता है क्योंकि आप .share() (उर्फ .publish().refCount()) के साथ मल्टीकास्टिंग का उपयोग कर रहे हैं।

इसका मतलब है कि पहले a.subscribe(...).refCount() को अपने स्रोत की सदस्यता लेने के लिए बनाता है और यह सब्सक्राइब किया जाएगा (ध्यान दें कि अवलोकन योग्य .fromEvent(someDom, 'click') कभी पूरा नहीं होता है)।

तब जब आप अंततः b.subscribe(...) फोन यह केवल Subject.share() अंदर की सदस्यता लेंगे और .startWith(-1) के माध्यम से जाना कभी नहीं होगा, क्योंकि यह multicasted है और पहले से ही .share() में सदस्यता ली।

+0

हे! यही वह भी था जिसे मैंने समझा, अवलोकन के बारे में और अधिक विस्तार करने के लिए बहुत बहुत धन्यवाद। इस परिदृश्य का एक समाधान कनेक्ट करने योग्य अवलोकनों का उपयोग करना और सब्सक्रिप्शन स्थापित करने के बाद कनेक्ट कनेक्ट करना भी है। इस तरह सभी ग्राहकों को मूल्य के साथ शुरुआत मिल जाएगी। – dinony

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