CSP बनाम RxJS: जो आप नहीं जानते हैं।

CSP का क्या हुआ?

जेम्स पॉन्ड द्वारा अनस्प्लैश पर फोटो

आपने शायद यह सोचकर इस लेख को क्लिक किया है कि "CSP क्या है?" फिर भी चकरा गया?

CSP एक साझा चैनल का उपयोग करके आपके कोड में विभिन्न कार्यों (जनरेटर) के बीच संचार करने की एक विधि है।

दुनिया में इसका क्या मतलब है? लेम्मे इसे सीधे हां कह दें। एक चैनल की यह अवधारणा है इसे एक कतार की तरह समझें। आप उस पर सामान रख सकते हैं और सामान उतार सकते हैं।

तो दो कार्यों के साथ, आप एक चैनल (निर्माता) पर सामान जोड़ सकते हैं और दूसरा काम बंद कर सकते हैं और कुछ काम (उपभोक्ता) कर सकते हैं।

एक विशिष्ट उन्नत उपयोग का मामला कई उत्पादकों और एक उपभोक्ता होगा। इस तरह आप अपने द्वारा प्राप्त किए जा रहे डेटा को नियंत्रित कर सकते हैं, लेकिन आपके पास इसे देने के लिए कई चीजें हो सकती हैं।

RxJS के विपरीत, ये चैनल स्वचालित हैं। आपको विली-निली के मूल्य नहीं मिलते हैं, आपको उनके लिए पूछना होगा।

CSP का उपयोग करना

यहां सुपर सरल (और मृत) लाइब्रेरी Channel4 का उपयोग करके एक छोटा CSP उदाहरण दिया गया है:

CSP चैनल एसिंक्रोनस रूप से चलते हैं। इसलिए जैसे ही यह चलता है, सिंक्रोनस "संपन्न" संदेश पहले लॉग हो जाता है। फिर हमारे चैनल लेने वालों को क्रम में निष्पादित किया जाता है।

मेरे लिए सबसे दिलचस्प बात CSP की प्रकृति का अवरुद्ध (लेकिन async) है। ध्यान दें कि चैनल पर "C" डालने से पहले हमने तीसरा टेक कैसे बनाया। पहले दो कार्यों के विपरीत, तीसरे में कुछ भी नहीं है। एक बार जब कोई चीज चैनल में आती है, तो वह तुरंत इसे ले लेता है

यह भी ध्यान दें, उपभोक्ताओं को लगातार चैनल को बंद करने की आवश्यकता है जब तक कि चैनल बंद न हो जाए। इसीलिए "D" को कभी लॉग नहीं किया जाता है। आपको चैनल से अगले मान को हथियाने के लिए एक और टेक को परिभाषित करने की आवश्यकता है।

पर्यवेक्षकों के साथ, आपको मान दिए गए हैं इसलिए आपको मैन्युअल रूप से उन्हें बंद करने के बारे में चिंता करने की ज़रूरत नहीं है। यदि आप उन मानों को बफ़र करना चाहते हैं, तो RxJS उस उद्देश्य के लिए काफी कुछ पाइपलाइन विधियाँ प्रदान करता है। सीएसपी का उपयोग करने की आवश्यकता नहीं है।

वेधशालाओं के पीछे पूरी अवधारणा यह है कि हर सुनने वाले को एक ही डेटा मिलता है जैसे ही प्रेक्षक अगले फोन करता है। CSP के साथ, यह IxJS के दृष्टिकोण की तरह है जहाँ आप डेटा विखंडू में काम कर रहे हैं।

CSP है खराब !?

आप गो और बंद में सीएसपी कार्यान्वयन पा सकते हैं। जावास्क्रिप्ट में, सभी लेकिन कुछ सीएसपी पुस्तकालय मृत हैं और फिर भी, उनके दर्शक छोटे हैं।

मुझे विन्सेंज़ो चियानसे की भयानक बात से सीएसपी के बारे में पता चला। उन्होंने इस हाई-एंड लाइब्रेरी की सिफारिश की जिसे js-csp कहा जाता है। अफसोस की बात है कि अब इसका रखरखाव नहीं किया गया है।

अपनी 2017 की बातचीत में उन्होंने जो कहा, उसके आधार पर यह एक बड़ी बात थी। उन्होंने इस बारे में बात की कि कैसे ट्रांसड्यूसर कुछ महीनों में विस्फोट करने वाले थे और उनके लिए पहले से ही js-csp का समर्थन था।

ऐसा लगता है कि CSP मूलभूत रूप से बदल सकता है कि आपने जावास्क्रिप्ट में async एप्लिकेशन कैसे विकसित किए हैं। लेकिन ऐसा कभी नहीं हुआ। ट्रांसड्यूसर का निधन; RxJS जैसे पुस्तकालयों द्वारा प्रतिस्थापित, और CSP के आसपास प्रचार प्रचारित हुआ।

विन्सेन्ज़ो ने ध्यान दिया कि वादों से ऊपर CSP एक संपूर्ण level नोटेर स्तर है। वह सही है। अतुल्यकालिक रूप से परस्पर क्रिया करते हुए आपको मिलने वाली शक्ति अविश्वसनीय है।

वादे, उनके उत्सुक स्वभाव से, एक ही बॉलपार्क में भी नहीं। बहुत कम ही उन्हें पता था कि पिछले कुछ सीएसपी पुस्तकालयों में अंडर-द-हड का समर्थन करने वाले वादे खत्म होंगे।

सीएसपी वैकल्पिक: Redux-Saga

यदि आपने कभी Redux-Saga का उपयोग किया है, तो CSP के आस-पास के विचार और अवधारणाएं शायद परिचित हों। क्योंकि वे हैं वास्तव में, Redux-Saga जावास्क्रिप्ट में CSP का कार्यान्वयन है; अब तक सबसे लोकप्रिय।

Redux-Sagas में "चैनल" की अवधारणा भी है:
https://github.com/redux-saga/redux-saga/blob/master/docs/advanced/Channels.md

चैनल बाहरी घटनाओं से जानकारी प्राप्त करते हैं, Redux स्टोर पर बफर एक्शन करते हैं, और दो सागाओं के बीच संवाद करते हैं। यह उसी तरह से है जैसे वे CSP में एक ही टेक और फ़ंक्शंस के साथ उपयोग करते थे।

जावास्क्रिप्ट में सीएसपी के वास्तविक कार्यान्वयन को देखने के लिए बहुत अच्छा है, लेकिन बहुत कम लोगों ने इस पर ध्यान दिया है। इससे पता चलता है कि मरने से पहले सीएसपी कितना कम था।

CSP वैकल्पिक: Redux-Observable

आपने Redux-Observable नामक कुछ के बारे में सुना होगा। यह CSP और Redux-Saga के लिए एक समान अवधारणा है, लेकिन जनरेटर की अनिवार्य शैली के बजाय, यह एक कार्यात्मक दृष्टिकोण लेता है और "महाकाव्यों" के रूप में संदर्भित RxJS पाइपलाइनों का उपयोग करता है।

Redux-Observable में, सब कुछ दो विषयों के माध्यम से होता है: कार्रवाई $ और राज्य $। वो आपके चैनल हैं।

मैन्युअल रूप से लेने और डालने के बजाय, आप किसी क्रिया या राज्य चैनल के उपभोक्ता के रूप में विशिष्ट कार्यों के लिए सुन रहे हैं। प्रत्येक महाकाव्य में पाइपलाइन के माध्यम से कार्रवाई करके एक निर्माता होने की क्षमता भी है।

यदि आप CSP की तरह Redux-Observable में एक कतार बनाना चाहते हैं, तो यह थोड़ा अधिक जटिल है क्योंकि इस उद्देश्य के लिए कोई ऑपरेटर उपलब्ध नहीं है, लेकिन यह पूरी तरह से संभव है।

मैंने एक उत्तर बनाया जो बस इतना ही करता है:

हमारे पहले के CSP उदाहरण की तुलना में, यह वही है जो आप देख सकते हैं:

उदाहरण के लिए केवल RxJS की आवश्यकता होती है और सब कुछ सरलता के लिए एकल फ़ाइल में होता है। जैसा कि आप देख सकते हैं, RxJS में उसी तरह से वस्तुओं को कतारबद्ध करना बहुत कठिन है, जिस तरह से आप CSP के साथ कर सकते हैं। यह पूरी तरह से संभव है, लेकिन इसके लिए बहुत अधिक कोड की आवश्यकता होती है।

निजी तौर पर, मुझे RxJS को बफरवैन जैसा एक ऑपरेटर जोड़ना पसंद है, जो आपको पूरे बफर के बजाय अलग-अलग आइटम को विभाजित करने की अनुमति देता है। तब आप Redux-Observable में CSP- शैली को बहुत आसान बना सकते थे।

निष्कर्ष

CSP एक शांत अवधारणा थी, लेकिन यह जावास्क्रिप्ट में मृत है। Redux-Saga और Redux-Observable योग्य विकल्प हैं।

ट्रांसड्यूसर पुस्तकालयों के साथ एकीकृत करने की क्षमता के साथ, RxJS में अभी भी स्पष्ट पैर-अप है। यह शिक्षकों और उत्पादन अनुप्रयोगों के बड़े पैमाने पर समुदाय को प्रतिस्पर्धा करना मुश्किल बनाता है।

इसलिए मुझे लगता है कि CSP की जावास्क्रिप्ट में मृत्यु हो गई।

अधिक पढ़ता है

यदि आपको पसंद है कि आप क्या पढ़ते हैं, तो कृपया मेरे अन्य लेखों को इसी तरह के आंख खोलने वाले विषयों पर देखें:

  • Redux-Observable अपने राज्य की समस्याओं को हल कर सकते हैं
  • Redux के बिना Redux-Observable
  • कॉलबैक: निश्चित गाइड
  • वादे: निश्चित गाइड