2015-12-04 20 views
8
में नमूदार पूरा कर सकते हैं

मान लीजिए कि हम करते हैं एक नमूदार:मैं कैसे RxJS

var observable = Rx.Observable 
    .fromEvent(document.getElementById('emitter'), 'click'); 

मैं कैसे कर सकते हैं यह पूरा (क्या पर्यवेक्षकों सदस्यता ली सभी के लिए onComplete घटना को ट्रिगर किया जाएगा)?

उत्तर

13

इस वर्तमान रूप में, आप नहीं कर सकते। आपका अवलोकन एक ऐसे स्रोत से लिया गया है जो पूरा नहीं होता है, इसलिए यह स्वयं पूर्ण नहीं हो सकता है। आप क्या कर सकते हैं इस स्रोत को एक पूर्ण स्थिति के साथ बढ़ाएं। इस तरह काम करेंगे:

var end$ = new Rx.Subject(); 
var observable = Rx.Observable 
    .fromEvent(document.getElementById('emitter'), 'click') 
    .takeUntil(end$); 

आप observable समाप्त करना चाहते हैं, तो आप end$.onNext("anything you want here"); है। इस मामले में अंतिम घटना आपके द्वारा उत्पन्न होती है। यदि यह एक अन्य स्रोत है जो घटना (कीप्रेस, इत्यादि) उत्पन्न करता है तो आप takeUntil के तर्क के रूप में सीधे उस स्रोत से व्युत्पन्न एक अवलोकन योग्य डाल सकते हैं।

प्रलेखन:

+0

यह ब्राउज़र ऐप में मेमोरी लीक का संभावित खतरा प्रतीत होता है। ऐसा लगता है कि एचटीएमएल तत्वों से जुड़े पर्यवेक्षकों की असीमित संख्या पहले से ही दायरे से हटा दी जा सकती है। यह जीसी को उन तत्वों को हटाने से रोक सकता है, और स्मृति से कई अन्य रेफरी ... – ulfryk

+1

?? मैं तुम्हारा पीछा नहीं करता यह क्या है'? किसी भी मामले में, 'ऑनम्प्लेटेड' हैंडलर सभी पर्यवेक्षकों के लिए ट्रिगर किया जाएगा, जो आपने पूछा था। मेमोरी लीक के बारे में, जब अंतिम पर्यवेक्षक ने 'सेवेंथ' द्वारा बनाए गए अवलोकन योग्य से सदस्यता समाप्त कर ली है, तो बनाए गए ईवेंट श्रोता को हटा दिया गया है। – user3743222

+0

"सभी सब्स्क्राइब किए गए पर्यवेक्षकों के लिए पूर्ण घटना पर क्या ट्रिगर होगा" मेरे प्रश्न का दूसरा अतिरिक्त हिस्सा है। मुझे जो हासिल करने की आवश्यकता है वह ईवेंट श्रोता को हटा रहा है।पर्यवेक्षण का पूर्ण समापन इसलिए जब मैं घटना की बात नहीं सुनता तो मैं सभी अप्रचलित संदर्भों को हटा सकता हूं। – ulfryk

1

क्या मेरे लिए काम किया take() ऑपरेटर का उपयोग कर रहा है। घटनाओं की एक्स संख्या के बाद यह पूर्ण कॉलबैक को आग लगा देगा। तो 1 गुजरकर, यह पहली घटना के बाद पूरा हो जाएगा।

टाइपप्रति:

private preloadImage(url: string): Observable<Event> { 
    let img = new Image(); 
    let imageSource = Observable.fromEvent(img, "load"); 

    img.src = url; 

    return imageSource.take(1); 
} 
+0

'पहले() 'का उपयोग' ले (1)' के बजाय किया जा सकता है। –

1

मुझे लगता है कि आप देख रहे हैं dispose() तरीका है।

से: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables

ध्यान दें कि सदस्यता के विधि, एक डिस्पोजेबल देता है ताकि आप एक दृश्य करने के लिए सदस्यता समाप्त करने और आसानी से नष्ट कर सकें। जब आप अवलोकन अनुक्रम पर निपटान विधि का आह्वान करते हैं, तो पर्यवेक्षक डेटा के लिए देखने योग्य को सुनना बंद कर देगा। आम तौर पर, आपको स्पष्ट रूप से निपटान को तब तक कॉल करने की आवश्यकता नहीं है जब तक आपको प्रारंभिक सदस्यता समाप्त करने की आवश्यकता न हो, या जब स्रोत अवलोकन योग्य अनुक्रम पर्यवेक्षक की तुलना में अधिक जीवन काल होता है। आरएक्स में सदस्यता फाइनेंजर के उपयोग के बिना अग्नि-और-भूल परिदृश्यों के लिए डिज़ाइन की गई है। ध्यान दें कि अवलोकन करने योग्य ऑपरेटरों का डिफ़ॉल्ट व्यवहार जितनी जल्दी हो सके सदस्यता का निपटान करना है (यानी, जब एक पूर्ण या ऑनर संदेश प्रकाशित होता है)। उदाहरण के लिए, कोड एक्स और बी दोनों अनुक्रमों में एक्स की सदस्यता लेगा। अगर कोई त्रुटि फेंकता है, तो एक्स तुरंत बी से सदस्यता समाप्त कर दिया जाएगा।

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