2016-11-12 9 views
7

मुझे आश्चर्य है, अगर वहाँ .take(1) और .unsubscribe का उपयोग कर के बीच के प्रदर्शन में कोई अंतर नहीं है जब unsubscribe सही सदस्यता के बाद प्रयोग किया जाता है:अंतर .take (1)

var observable = Rx.Observable.interval(100); 

पहले:

var subscription = observable.subscribe(function(value) { 
    console.log(value); 
}).unsubscribe(); 

दूसरा:

var subscription = observable.take(1).subscribe(function(value) { 
     console.log(value); 
    }); 

कोई भी विचार इसका प्रदर्शन प्रदर्शन को अलग करता है?

+0

'var subscription = observable.subscribe ({function A})। सदस्यता रद्द करें(); 'अपेक्षित मज़ेदार के रूप में काम नहीं करेगा, इस पंक्ति को उत्साहित करने के बाद ए को बुलाया जाएगा। तो केवल एक मान प्राप्त करने के लिए, आपको शून्य मान मिलेगा। इसे मैन्युअल रूप से सब्सक्राइब करने के लिए अनुशंसा की जाती है और आपके लिए सदस्यता के साथ सौदे लेने जैसे अन्य तरीकों का उपयोग करें (..) या अन्य विधियों का उपयोग करें। –

उत्तर

21

प्रत्येक एक अलग उद्देश्य प्रदान करता है इसलिए उनकी तुलना करना मुश्किल है।

सामान्य तौर पर अगर आप इस स्रोत ले:

let source = Observable.range(1,3); 

और subscribe() साथ में उपभोग unsubscribe() द्वारा तुरंत बाद:

source.subscribe(
    val => console.log(val), 
    undefined, 
() => console.log('complete') 
).unsubscribe(); 

तो स्रोत से सभी मूल्यों हालांकि मैं भी उत्सर्जित हो जा रहे हैं सब्सक्राइब करने के ठीक बाद unsubscribe() कहा जाता है। ऐसा इसलिए है क्योंकि कोड अभी भी सख्ती से अनुक्रमिक है और source एक ठंडा अवलोकन योग्य है।

1 
2 
3 
complete 

Btw, source.delay(0).subscribe(...).unsubscribe() बनाने के लिए और देखो क्या होता है करने के लिए .delay(0) ऑपरेटर जोड़ने का प्रयास करें। यह वास्तविक setTimout() कॉल का उपयोग कर ग्राहक कॉलबैक एसिंक्रोनस को मूल्यों को उत्सर्जित करता है और इस कारण से unsubscribe() कॉलबैक तक पहुंचने से पहले इसे कॉल किया जाता है और तत्काल त्याग दिया जाता है क्योंकि हमने पहले ही सदस्यता समाप्त कर दी है।

दूसरे शब्दों में unsubscribe() चलिए आप किसी भी समय मूल्य प्राप्त करना बंद कर देते हैं। यहां तक ​​कि जब स्रोत ने सभी मानों को उत्सर्जित नहीं किया है (हम कभी भी पूर्ण कॉल प्राप्त नहीं करते हैं)।

take() ऑपरेटर का उपयोग करके चेन को केवल विशिष्ट मानों को उत्सर्जित करने के लिए सीमित किया जाता है।

source.take(1).subscribe(
    val => console.log(val), 
    undefined, 
() => console.log('complete') 
); 

इसमें केवल एक मूल्य का उत्सर्जन करता है और पूरे करता है:

1 
complete 

भले ही आप .unsubscribe() जोड़ा परिणाम ही होगा। https://jsbin.com/copujo/4/edit?js,console

तो take() एक ऑपरेटर observables चेनिंग जबकि unsubscribe()Subscription वस्तु पर एक विधि है:

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

+2

हाय @ मार्टिन लेता है (1) सदस्यता रद्द करें? अगर मैं (1) जोड़ता हूं, तो क्या मुझे फिर से सदस्यता रद्द करना होगा?धन्यवाद – fifth

+4

@fifth नहीं, आप नहीं करते हैं। जब श्रृंखला पूरी हो जाती है तो यह सभी निपटान हैंडलर को फिर से कॉल करती है ताकि आपको स्वयं को 'सदस्यता समाप्त' करने की आवश्यकता न हो। स्पष्टीकरण के लिए – martin

+1

धन्यवाद, मुझे बहुत मदद मिली – fifth

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