2017-01-30 8 views
6

प्रकाशन रीप्ले (1) .refCount() देर से ग्राहकों के लिए अंतिम मूल्य क्यों नहीं चलाता है?आरएक्सजेएस प्रकाशित क्यों करता है (1) .refCount() replay नहीं?

a = new Rx.Subject(); 
 
b = a.publishReplay(1).refCount(); 
 

 
a.subscribe(function(x){console.log('timely subscriber:',x)}); 
 
a.next(1); 
 
b.subscribe(function(x){console.log('late subscriber:',x)});
<script src="http://reactivex.io/rxjs/user/script/0-Rx.js"></script>

अपेक्षित उत्पादन:

timely subscribe: 1 
late subscriber: 1 

वास्तविक उत्पादन

timely subscriber: 1 

उत्तर

1

आपका पहला ग्राहक a का सदस्य बनता, refCount के बाद से पहली धारा जब सक्रिय हो जाता है वहाँ कम से कम 1 ग्राहक है (जिसमें से कोई भी नहीं है, क्योंकि b नहीं है लेकिन a सब्सक्राइब किया गया है), यह आपके अंतिम स्थान तक सक्रिय नहीं है।

a = new Rx.Subject(); 
 
b = a.publishReplay(1).refCount(); 
 

 
b.subscribe(function(x){console.log('timely subscriber:',x)}); 
 
a.next(1); 
 
b.subscribe(function(x){console.log('late subscriber:',x)});
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

9

यह इसलिए होता है क्योंकि समय पर कॉल a.next(1)publishReplay(1) इसके स्रोत नमूदार (इस मामले में विषय a) के सदस्य नहीं है और इसलिए आंतरिक ReplaySubject मूल्य प्राप्त नहीं होगा 1

आरएक्सजेएस 5 में ऑपरेटर के बीच वास्तविक सदस्यता तब होती है जब आप चेन के अंत में सदस्यता लेते हैं जो इस उदाहरण में b.subscribe(...) है। देखें:

जब तक आप फोन subscribe() ऑपरेटरों lift() विधि है कि बस ऑपरेटर का एक उदाहरण ले जाता है और नई प्रत्यक्ष करने के लिए इसे प्रदान करती है के लिए धन्यवाद श्रृंखलित कर रहे हैं। उपरोक्त दो लिंक में आप देख सकते हैं कि operator.call() विधि बाद में सदस्यता लेने पर कॉल किया जाता है। देखें:

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