मुझे RxJS में ऑपरेटर पाइपलाइनों की दक्षता के बारे में स्पष्टीकरण की आवश्यकता है।
आरएक्सजेएस में ऑपरेटर पाइपलाइन के बारे में मेरा वर्तमान ज्ञान यह है कि पाइपलाइन के अंदर प्रत्येक ऑपरेटर एक अवलोकन योग्य प्राप्त करता है और एक नया (संभावित रूप से संशोधित) अवलोकन योग्य बनाता है जो इनपुट के रूप में अगले ऑपरेटर को वापस कर दिया जाता है। यह व्यवहार जावास्क्रिप्ट फ़िल्टर, मानचित्र, व्यवहार को कम करने के समान होगा। इस प्रकार मूल अवलोकन योग्य (धारा) या सरणी को अछूता/शुद्ध छोड़ देना।
यह धारणा RxJS दस्तावेज़ीकरण द्वारा समर्थित है: https://rxjs-dev.firebaseapp.com/ गाइड/ऑपरेटर
एक पाइपेबल ऑपरेटर एक ऐसा फ़ंक्शन है जो एक ऑब्जर्वेबल को अपने इनपुट के रूप में लेता है और दूसरा ऑब्जर्वेबल देता है। यह एक शुद्ध ऑपरेशन है: पिछला ऑब्जर्वेबल अपरिवर्तित रहता है।
लंबी ऑपरेटर पाइपलाइनों को ध्यान में रखते हुए मध्यवर्ती वेधशालाओं का निर्माण मुझे महंगा लगता है।
इसके अलावा मैं सर्गी मंसिला द्वारा लिखित पुस्तक 'रिएक्टिव प्रोग्रामिंग विद आरएक्सजेएस 5' पढ़ रहा हूं। मुझे पता है कि आरएक्सजेएस वर्तमान में संस्करण 6.5.3 पर है, लेकिन मुझे उम्मीद है कि तब से मूल तंत्र नहीं बदला है।
पुस्तक में पाइपलाइन की दक्षता के बारे में एक खंड है जो कहता है कि देखने योग्य पाइपलाइन मध्यवर्ती वेधशालाएं नहीं बनाती हैं। इसके बजाय वे एक ही बार में प्रत्येक तत्व पर सभी ऑपरेशन लागू करते हैं। जो समझ में आता है क्योंकि ऑपरेटर टेक(राशि) पहले राशि तत्वों को लेने के बाद अवलोकन योग्य स्ट्रीम को पूरा करता है। यह आलसी मूल्यांकन के बारे में भी बताता है जो स्रोत देखने योग्य स्ट्रीम को अधिकतम पर केवल एक बार या टेक शर्त पूरी होने तक ट्रैवर्स करता है।
import * as rxCore from 'https://dev.jspm.io/rxjs@6/_esm2015/index';
import * as rxOps from 'https://dev.jspm.io/rxjs@6/_esm2015/operators';
const numberStream = rxCore.range(0, 10);
numberStream.pipe(
rxOps.map(number => number * number), //creates Observable with [0,1,4,9,16,25,36,49,64,81]
rxOps.filter(number => number % 2 === 0), //creates Observable with [0,4,16,36,64]
rxOps.take(3) //completes after [0,4,16]
).subscribe(console.log); //logs 0, 4, 16
क्या इस ऑपरेटर पाइपलाइन के अंदर कोई मध्यवर्ती वेधशालाएं बनाई जा रही हैं? या केवल पूरी पाइपलाइन एक नया अवलोकन योग्य बना रही है जिससे numberStream अछूता रह गया है? या वास्तव में मामला क्या है?
2 जवाब
pipe()
में पास होने के लिए आप अपना कस्टम ऑपरेटर कैसे बनाते हैं, इस पर गौर करके
source=>source.pipe(...)
यह जो अपेक्षा करता है वह एक ऐसा फ़ंक्शन है जो वैकल्पिक रूप से संशोधित/संलग्न/स्रोत पर अधिक संचालन लागू करके अवलोकन योग्य देता है। मुझे लगता है कि यह तत्काल देखने योग्य नहीं है क्योंकि पाइप के अंत में आपके पास केवल एक स्रोत होगा।
लगभग हर RxJS ऑपरेटर इंटरमीडिएट ऑब्जर्वेबल बनाता है। वास्तव में, मुझे ऐसे ऑपरेटर का उदाहरण नहीं मिला है जो ऐसा नहीं करता है, इसलिए मैं मान सकता हूं कि वे सभी ऐसा करते हैं।
उदाहरण: map()
आंतरिक रूप से ऑपरेटर कॉल lift
विधि। lift
क्या करता है कि यह नया ऑब्जर्वेबल बनाता है और वर्तमान ऑब्जर्वेबल को source
ऑब्जर्वेबल घोषित करके इसे लौटाता है।
इसका मतलब है, कि आपके उदाहरण में range
एक ऑब्जर्वेबल बनाता है, जबकि map
, filter
और take
तीन नए ऑब्जर्वेबल बनाते हैं, उनमें से प्रत्येक में source
ऑब्जर्वेबल है। वर्तमान से पहले बनाए गए से। तो, source
, map
के लिए ऑब्जर्वेबल, range
आदि द्वारा निर्मित एक बन जाता है।
इसलिए, जब आप किसी भी ऑब्जर्वेबल की सदस्यता लें , यह कोशिश करता है source
ऑब्जर्वेबल ऑपरेटर। map
के मामले में, यह कॉल यह call
तरीका है जो स्रोत Observable
को सब्सक्राइब करता है। आपके मामले में, यह range
द्वारा बनाए गए एक की सदस्यता लेगा। इस तरह, subscribe
को स्रोत पर कॉल करना पहले ऑब्जर्वेबल (जिसमें source
नहीं है) तक जाता है, जिसका अर्थ है कि कोई ऑपरेटर लागू नहीं किया गया है।
लंबी ऑपरेटर पाइपलाइनों को ध्यान में रखते हुए मध्यवर्ती वेधशालाओं का निर्माण मुझे महंगा लगता है।
इस बात की चिंता मत करो। इंटरमीडिएट ऑब्जर्वेबल सिर्फ जावास्क्रिप्ट ऑब्जेक्ट हैं। वे हल्के वजन वाले हैं और आप आसानी से इन वस्तुओं के बड़े ढेर नहीं बना सकते हैं जो प्रदर्शन के मुद्दों का कारण बनेंगे। इसके अलावा, वेधशाला आलसी हैं, वे तब तक कुछ नहीं कर रहे हैं जब तक कि कोई घटना न हो जाए।
पुस्तक में पाइपलाइन की दक्षता के बारे में एक खंड है जो कहता है कि देखने योग्य पाइपलाइन मध्यवर्ती वेधशालाएं नहीं बनाती हैं। इसके बजाय वे एक ही बार में प्रत्येक तत्व पर सभी ऑपरेशन लागू करते हैं।
खैर, मेरी राय में, यह आधा सच है। हां, वे प्रत्येक तत्व के लिए लागू ऑपरेटर हैं। , लेकिन सिंगल ऑब्जर्वेबल होने से नहीं, बल्कि कई बनाकर। शायद यह RxJS 5 से पहले का मामला था, लेकिन आज के संस्करणों के साथ नहीं।