RxJS लाइब्रेरी के साथ जावास्क्रिप्ट (Node.js) में रिएक्टिव प्रोग्रामिंग
रिएक्टिव प्रोग्रामिंग एक प्रतिमान है जो एसिंक्रोनस डेटा स्ट्रीम और परिवर्तनों के प्रसार पर केंद्रित है। Node.js इकोसिस्टम में, इस अवधारणा को RxJS (Reactive Extensions for JavaScript) लाइब्रेरी के माध्यम से कार्यान्वित किया जाता है। कॉलबैक या प्रॉमिस के साथ पारंपरिक कार्य के बजाय, RxJS Observable के साथ काम करने की पेशकश करता है - ऐसी वस्तुएं जो समय के साथ डेटा के प्रवाह का प्रतिनिधित्व करती हैं।
मुख्य अवधारणाएँ
RxJS के मूल में तीन प्रमुख संस्थाएँ हैं:
- Observable — डेटा का स्रोत जो समय के साथ मान उत्पन्न कर सकता है (माउस इवेंट, HTTP अनुरोध, फ़ाइल पढ़ना)।
- Observer — उपभोक्ता जो Observable की सदस्यता लेता है और तीन प्रकार की घटनाओं पर प्रतिक्रिया करता है:
next(नया मान),error(त्रुटि),complete(स्ट्रीम का समापन)। - Operators — स्ट्रीम को बदलने, फ़िल्टर करने और संयोजित करने के लिए शुद्ध फ़ंक्शन (उदाहरण के लिए,
map,filter,mergeMap)।
स्थापना और सेटअप
Node.js में RxJS के साथ काम करने के लिए, npm के माध्यम से पैकेज स्थापित करें:
npm install rxjsफ़ाइल में शामिल करना:
const { Observable } = require('rxjs');const { map, filter } = require('rxjs/operators');Observable बनाना
सबसे सरल उदाहरण - संख्याओं की एक स्ट्रीम बनाना:
const { Observable } = require('rxjs');
const stream$ = new Observable(subscriber => { subscriber.next(1); subscriber.next(2); subscriber.next(3); subscriber.complete();});
// सदस्यताstream$.subscribe({ next: value => console.log('प्राप्त:', value), error: err => console.error('त्रुटि:', err), complete: () => console.log('स्ट्रीम समाप्त')});
// आउटपुट: प्राप्त: 1, प्राप्त: 2, प्राप्त: 3, स्ट्रीम समाप्तऑपरेटर: map और filter
ऑपरेटर साइड इफेक्ट पैदा किए बिना स्ट्रीम में डेटा को संसाधित करने की अनुमति देते हैं। सम संख्याओं को फ़िल्टर करने और रूपांतरण का उदाहरण:
const { of } = require('rxjs');const { map, filter } = require('rxjs/operators');
const numbers$ = of(1, 2, 3, 4, 5, 6);
numbers$.pipe( filter(x => x % 2 === 0), // केवल सम map(x => x * 10) // 10 से गुणा करें).subscribe(result => console.log(result));
// आउटपुट: 20, 40, 60एसिंक्रोनस संचालन के साथ कार्य
RxJS इनपुट/आउटपुट इवेंट को संभालने के लिए उत्कृष्ट है। उदाहरण के लिए, from का उपयोग करके फ़ाइल पढ़ना:
const { from } = require('rxjs');const { map } = require('rxjs/operators');const fs = require('fs');const path = require('path');
// Promise के रूप में फ़ाइल पढ़नाconst readFilePromise = (filePath) => { return new Promise((resolve, reject) => { fs.readFile(filePath, 'utf8', (err, data) => { if (err) reject(err); else resolve(data); }); });};
// Promise से Observable बनानाconst fileStream$ = from(readFilePromise('./data.txt'));
fileStream$.pipe( map(content => content.toUpperCase())).subscribe({ next: data => console.log('फ़ाइल सामग्री:', data), error: err => console.error('पढ़ने में त्रुटि:', err)});स्ट्रीम का संयोजन
RxJS की मजबूत विशेषताओं में से एक कई स्ट्रीम को संयोजित करने की क्षमता है। merge (स्ट्रीम का विलय) के साथ उदाहरण:
const { interval, merge } = require('rxjs');const { take, map } = require('rxjs/operators');
// स्ट्रीम A: हर 1 सेकंडconst streamA$ = interval(1000).pipe( take(3), map(x => `A: ${x}`));
// स्ट्रीम B: हर 1.5 सेकंडconst streamB$ = interval(1500).pipe( take(3), map(x => `B: ${x}`));
// विलय