बस आश्चर्य है कि Observable.combineLatest
और के बीच अंतर क्या है Observable.forkJoin
? जहां तक मैं देख सकता हूं, एकमात्र अंतर यह forkJoin
है कि ऑब्जर्वबल्स को पूरा करने की उम्मीद है, जबकि combineLatest
नवीनतम मान लौटाएंगे।
जवाबों:
न केवल forkJoin
सभी इनपुट वेधशालाओं को पूरा करने की आवश्यकता होती है, बल्कि यह एक अवलोकन योग्य भी देता है जो एकल मान उत्पन्न करता है जो इनपुट वेधशालाओं द्वारा उत्पादित अंतिम मानों की एक सरणी है। दूसरे शब्दों में, यह तब तक इंतजार करता है जब तक कि अंतिम इनपुट का अवलोकन पूरा नहीं हो जाता है, और फिर एक एकल मूल्य और पूरा करता है।
इसके विपरीत, combineLatest
एक ऑब्जर्वेबल रिटर्न देता है जो हर बार इनपुट वेधशालाओं में एक नया मूल्य पैदा करता है, एक बार सभी इनपुट वेधशालाएं कम से कम एक मूल्य का उत्पादन करती हैं। इसका मतलब यह है कि इसमें अनंत मूल्य हो सकते हैं और पूरे नहीं हो सकते। इसका यह भी अर्थ है कि मूल्य के उत्पादन से पहले इनपुट वेधशालाओं को पूरा नहीं करना है।
.catch()
, .onErrorResumeNext()
और संभवतः .retry()
(यदि एचटीपी कॉल रुक-रुक कर विफल हो सकती है)।
combineLatest()
, आप इनपुट वेधशालाओं से नवीनतम मानों से आउटपुट मान का उत्पादन करने के तरीके के लिए एक प्रक्षेपण फ़ंक्शन की आपूर्ति कर सकते हैं। डिफ़ॉल्ट रूप से, यदि आप एक निर्दिष्ट नहीं करते हैं, तो आपको उत्सर्जित नवीनतम मानों का एक सरणी मिलेगा।
इसके अलावा:
combineLatest
आंतरिक रूप से उपयोग करता है concat
, जिसका अर्थ है कि अगले पर जाने से पहले सरणी में प्रत्येक अवलोकन के लिए एक मूल्य प्राप्त किया जाना चाहिए।
// partial source of static combineLatest (uses the rxjs/operators combineLatest internally):
// If you're using typescript then the output array will be strongly typed based on type inference
return function (source) { return source.lift.call(from_1.from([source].concat(observables)),
new combineLatest_1.CombineLatestOperator(project)); };
यदि आपके पास 3 स्रोत वेधशालाएं हैं, और वे प्रत्येक चलाने में 5 सेकंड लेते हैं तो इसे चलाने में 15 सेकंड लगेंगे combineLatest
। जबकि forkJoin
वे समानांतर में निष्पादित करते हैं इसलिए 5 सेकंड लगेंगे।
इसलिए forkJoin
कुछ और काम करता है, Promise.all(...)
जहां आदेश लागू नहीं किया गया है।
यदि किसी भी वेधशाला में त्रुटि हुई है - combineLatest
तो बाद वाले को निष्पादित नहीं किया जाएगा, लेकिन forkJoin
वे सभी चल रहे हैं। तो combineLatest
वेधशालाओं के एक 'अनुक्रम' को निष्पादित करने और सभी को एक साथ परिणाम एकत्र करने के लिए उपयोगी हो सकता है।
उन्नत नोट: यदि स्रोत वेधशालाएं पहले से ही 'चल रही हैं' (कुछ और द्वारा सदस्यता ली गई हैं) और आप share
उन पर उपयोग कर रहे हैं - तो आप इस व्यवहार को नहीं देखेंगे।
और भी अधिक उन्नत नोट: CombineLatest आपको हमेशा प्रत्येक स्रोत से नवीनतम देगा, इसलिए यदि कोई स्रोत वेधशाला एक से अधिक मानों का उत्सर्जन करता है तो आपको नवीनतम मिलेगा। यह सिर्फ प्रत्येक स्रोत के लिए एक ही मूल्य नहीं है और अगले पर चलते हैं। यदि आपको यह सुनिश्चित करने की आवश्यकता है कि आप केवल प्रत्येक स्रोत के लिए 'अगली उपलब्ध वस्तु' प्राप्त कर सकते हैं, तो आप स्रोत को अवलोकन योग्य जोड़ सकते हैं .pipe(take(1))
जैसा कि आप इसे इनपुट सरणी में जोड़ते हैं।
concat()
में combineLatest()
कोड कर रही है। यह मुझे Array.prototype.concat
विधि की तरह लगता है , RxJS concat
विधि की तरह नहीं । यह मानते हुए कि मैं सही हूं, तो यह उत्तर भ्रामक और गलत है, क्योंकि combineLatest()
वे एक-एक करके वेधशालाओं को क्रम से निष्पादित नहीं करते हैं। यह उन्हें समानांतर, उसी तरह निष्पादित करता है forkJoin()
। अंतर यह है कि कितने मूल्यों का उत्पादन किया जाता है और यदि स्रोत वेधशालाओं को पूरा करना है या नहीं।
[source].concat(observables)
यह मानते हुए कि आपके कहने का मतलब क्या है जब " combineLatest
आंतरिक रूप से उपयोग करता है concat
"। मुझे ऐसा लगता है जैसे आप RxJS कॉनैट के साथ एरे कॉनसैट को भ्रमित कर रहे हैं। उत्तरार्द्ध वास्तव में इनपुट वेधशालाओं को अनुक्रम में निष्पादित करता है, जब तक कि प्रत्येक पूरा नहीं हो जाता। लेकिन इसका उपयोग नहीं किया जाता है combineLatest()
, यह पूरी तरह से एक अलग ऑपरेटर है।
combineLatest()
और forkJoin()
दोनों समानांतर चलते हैं। दोनों के लिए लगभग 5000 आउटपुट के नीचे कोड चल रहा है। const start = new Date().getTime();
combineLatest([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start));
forkJoin([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start));
forkJoin - जब सभी वेधशालाएं पूरी हो जाती हैं, तो प्रत्येक से अंतिम उत्सर्जित मूल्य का उत्सर्जन करें।
CombLLestest - जब कोई भी ऑब्ज़र्वेबल एक मान का उत्सर्जन करता है, तो प्रत्येक से नवीनतम मान का उत्सर्जन करें।
उपयोग बहुत समान है, लेकिन आप forkJoin के विपरीत CombLatest से सदस्यता समाप्त करना न भूलें ।
combineLatest()
औरforkJoin()
कार्य हैं जो एक अवलोकन योग्य बनाते हैं। वे ऐसा ही करते हैं, लेकिन वाक्यविन्यास अलग है। भ्रमित न करेंcombineLatest
,rxjs/operators
जो 'पाइप करने योग्य' ऑपरेटर है। यदि आप गलत आयात करते हैं तो आपको त्रुटियाँ मिलेंगी।