2016-09-20 18 views
8

एक नमूदार कि .share() ऑपरेटर का उपयोग किया जाता है (बैकएंड में महंगा गणना के कारण) पर async पाइप का उपयोग कर, मैं इस व्यवहार पर ठोकर खाई:कोणीय 2 + rxjs: साथ .share() ऑपरेटर async पाइप

data$ = (new Observable(observer => { 
    let counter=0; 
    observer.next(counter) 

    window.setInterval(() => { 
     observer.next(counter); 
     counter++; 
    }, 2000); 
    })) 
    .share(); 

टेम्पलेट:

{{ (data$|async) !== null }} 
{{ (data$|async) !== null }} 

प्रारंभिक मूल्य का उत्पादन होता है:

true false 

निम्नलिखित आउटपुट (2 सेकंड से अधिक के बाद) हैं:

true true 

जो व्यवहार मैं पहले मूल्य के लिए भी अपेक्षा करता हूं। यदि मैं .share() को छोड़ देता हूं, तो पहले मान के लिए आउटपुट "सत्य सत्य" है, जैसा कि मैं अपेक्षा करता हूं। मुझे लगता है कि ऊपर दिया गया व्यवहार इस तथ्य के कारण है कि टेम्पलेट में पहली अभिव्यक्ति देखने योग्य निष्पादन को ट्रिगर करती है, और एक बार दूसरी एसिंक पाइप अवलोकन करने योग्य हो जाती है, तो डेटा पहले से ही चला गया है। क्या यह स्पष्टीकरण सही है? और मैं इस व्यवहार से कैसे बच सकता हूं?

+0

होना चाहिए के बाद से वहाँ एक भी मूल्य माना जाता है, यह 'observer.next है (...); observer.complete() '। – estus

+0

एक मूल्य के साथ उदाहरण केवल प्रदर्शन के लिए था, मेरे ऐप में देखने योग्य के पास कई मान – highwaychile

+0

है, कृपया उस कोड को प्रदान करें जो आपके मामले को प्रतिबिंबित करता है। – estus

उत्तर

12

the reference के अनुसार,

एक नमूदार या वादा करने के लिए async पाइप ग्राहकी लेने और नवीनतम मूल्य यह उत्सर्जित गया हो।

आरएक्सजेएस 4, shareReplay में वांछित व्यवहार प्राप्त करने के लिए उपयोग किया जाता है।

RxJS 5 में, shareReplay के लिए एक सीधा समकक्ष publishReplay द्वारा refCount (see the explanation और the discussion) का पालन किया है।

तो यह

data$ = (new Observable(observer => { ... })) 
.publishReplay(1) 
.refCount(); 
संबंधित मुद्दे