2017-03-16 9 views
5

share() ऑपरेटर को व्यवहार व्यवहार पर लागू किया जाता है। व्यवहार स्रोत के प्रारंभिक मूल्य है।व्यवहार प्रारंभिक मूल्य शेयर के साथ काम नहीं कर रहा है()

लक्ष्य एक साझा साझा सदस्यता बनाने के लिए है। लेकिन व्यवहार साझा करने के लिए प्रारंभिक मान होने पर यह साझा सदस्यता तब काम नहीं कर रही है।

अप्रत्याशित परिणाम प्राप्त करना।

कोड नीचे दिखाया गया है:

let subject = new Rx.BehaviorSubject(0); 
let published = subject 
        .do(v => console.log("side effect")) 
        .share(); 

published.subscribe((v) => console.log(v+" sub1")); 
published.subscribe((v) => console.log(v+" sub2")); 

subject.next(1); 

परिणाम:

"side effect" 
"0 sub1" 
"side effect" 
"1 sub1" 
"1 sub2" 

अपेक्षित परिणाम:

"side effect" 
"0 sub1" 
"1 sub1" <------------- this is missing from actual result 
"side effect" 
"1 sub1" 
"1 sub2" 

उत्तर

5

मैं समझता हूँ कि यहाँ क्या भ्रमित कर रहा है।

BehaviorSubject केवल सदस्यता पर उत्सर्जित करता है। हालांकि, आप share() ऑपरेटर का उपयोग कर रहे हैं जो आंतरिक रूप से publish()->refCount() के लिए एक शॉर्टेंड है। जब पहली बार पर्यवेक्षक सब्सक्राइब यह refCount() से चलाता है और यह जो do() में पक्ष प्रभाव का कारण बनता है और यह भी पर्यवेक्षक 0 sub1 में डिफ़ॉल्ट मान प्रिंट उसके स्रोत के लिए सदस्यता बनाता है:

"side effect" 
"0 sub1" 

तो फिर तुम एक और पर्यवेक्षक के साथ सदस्यता के लेकिन यह सदस्यता केवल publish() ऑपरेटर के अंदर Subject कक्षा में बनाई गई है (यही वह है जो इसके लिए बनाई गई है)। तो दूसरा पर्यवेक्षक डिफ़ॉल्ट 0 प्राप्त नहीं करेगा और न ही दुष्प्रभाव को ट्रिगर करेगा।

जब आप बाद में subject.next(1) फोन यह उत्पादन के अंतिम तीन लाइनों बनाया जाएगा:

"side effect" 
"1 sub1" 
"1 sub2" 
+0

तो कैसे हम "पक्ष प्रभाव", "0 sub1", प्रारंभिक सदस्यता के लिए "0 sub2" आदेश प्राप्त कर सकते हैं और फिर "साइड इफेक्ट", "1 सब 1", "1 सब 2" पहले 'अगली कॉल' के बाद? –

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