RxJS (Reactive Extensions for JavaScript) একটি শক্তিশালী লাইব্রেরি যা Observables এর মাধ্যমে অ্যাসিঙ্ক্রোনাস ডেটা স্ট্রিম ম্যানেজ করে। RxJS-এ Subject একটি বিশেষ ধরনের Observable, যা Observer এর মতো আচরণ করে, অর্থাৎ এটি ডেটা গ্রহণ করতে এবং প্রেরণ করতে পারে। Subject মূলত multicasting জন্য ব্যবহৃত হয়, যেখানে একটি একক Observable একাধিক সাবস্ক্রাইবারকে ডেটা পাঠাতে সক্ষম হয়। এটি বিভিন্ন ধরনের event-based বা real-time অ্যাপ্লিকেশন তৈরি করার জন্য অত্যন্ত কার্যকরী।
এই টিউটোরিয়ালে আমরা আলোচনা করবো RxJS Subject এর ভূমিকা, ধরন এবং ব্যবহার।
Subject এর ভূমিকা
Subject একটি বিশেষ ধরনের Observable এবং Observer হিসেবে কাজ করে। এটি এমন একটি observable যা একাধিক সাবস্ক্রাইবারের কাছে একই ডেটা পাঠানোর জন্য multicast করতে সক্ষম। সাধারণত, RxJS-এ যখন একটি Observable তৈরি করা হয়, তা একটিমাত্র সাবস্ক্রাইবারের জন্য ডেটা পাঠায়। কিন্তু Subject এর মাধ্যমে আপনি একাধিক সাবস্ক্রাইবারের কাছে একই ডেটা শেয়ার করতে পারেন।
Subject মূলত তিনটি কাজ করে:
- Observer হিসেবে কাজ করে: এটি next(), error(), এবং complete() মেথড ব্যবহার করে ডেটা পাঠাতে পারে।
- Observable হিসেবে কাজ করে: এটি অন্যান্য সাবস্ক্রাইবারদের কাছ থেকে ডেটা গ্রহণ করে এবং তাদের জানায়।
- Multicasting: একাধিক সাবস্ক্রাইবার একই ডেটা শেয়ার করতে পারে।
Subject এর ধরন
RxJS-এ মোট ৪ ধরনের Subject রয়েছে, যার প্রত্যেকটির নিজস্ব কার্যক্রম রয়েছে:
1. Basic Subject
Basic Subject একটি সাধারণ Subject, যা multicast করে এবং একাধিক সাবস্ক্রাইবারের কাছে ডেটা পাঠায়। এটি সাধারণত যখন কোনো ডেটার প্রবাহ একাধিক সাবস্ক্রাইবারকে শেয়ার করতে হয়, তখন ব্যবহার করা হয়।
উদাহরণ: Basic Subject
import { Subject } from 'rxjs';
const subject = new Subject();
// Subscriber 1
subject.subscribe(value => {
console.log('Subscriber 1:', value);
});
// Subscriber 2
subject.subscribe(value => {
console.log('Subscriber 2:', value);
});
subject.next('Hello');
subject.next('World');
আউটপুট:
Subscriber 1: Hello
Subscriber 2: Hello
Subscriber 1: World
Subscriber 2: World
এখানে, Subject একাধিক সাবস্ক্রাইবারকে একই ডেটা শেয়ার করছে। যখন subject.next() কল করা হয়, তখন সব সাবস্ক্রাইবার সেই মানটি গ্রহণ করে।
2. BehaviorSubject
BehaviorSubject এমন একটি Subject যা সর্বশেষ emitted মানটি সংরক্ষণ করে রাখে এবং নতুন সাবস্ক্রাইবাররা সেই মানটি পায়। এটি একটি initial value গ্রহণ করে এবং সাবস্ক্রাইবারদের কাছে সেই মানটি ফেরত পাঠায়।
উদাহরণ: BehaviorSubject
import { BehaviorSubject } from 'rxjs';
const subject = new BehaviorSubject('Initial Value');
// Subscriber 1
subject.subscribe(value => {
console.log('Subscriber 1:', value);
});
// Emitting new value
subject.next('New Value');
// Subscriber 2 (gets the last emitted value)
subject.subscribe(value => {
console.log('Subscriber 2:', value);
});
আউটপুট:
Subscriber 1: Initial Value
Subscriber 1: New Value
Subscriber 2: New Value
এখানে, BehaviorSubject প্রথমে 'Initial Value' পাঠায় এবং তারপর 'New Value' যখন emits করা হয়, তখন নতুন সাবস্ক্রাইবারও সর্বশেষ মান 'New Value' পায়।
3. ReplaySubject
ReplaySubject পূর্ববর্তী n সংখ্যক মান সংরক্ষণ করে রাখে এবং যখন কোনো নতুন সাবস্ক্রাইবার আসে, তখন সেগুলির সবগুলো পুনরায় পাঠায়। এটি historical values সংরক্ষণ করে এবং পুনরায় পাঠানোর জন্য ব্যবহৃত হয়।
উদাহরণ: ReplaySubject
import { ReplaySubject } from 'rxjs';
const subject = new ReplaySubject(2); // Keep the last 2 emitted values
// Emitting values
subject.next('Value 1');
subject.next('Value 2');
subject.next('Value 3');
// Subscriber 1
subject.subscribe(value => {
console.log('Subscriber 1:', value);
});
// Subscriber 2 (will receive the last 2 emitted values)
subject.subscribe(value => {
console.log('Subscriber 2:', value);
});
আউটপুট:
Subscriber 1: Value 3
Subscriber 2: Value 2
Subscriber 2: Value 3
এখানে, ReplaySubject(2) সর্বশেষ দুটি মান 'Value 2' এবং 'Value 3' সংরক্ষণ করে এবং নতুন সাবস্ক্রাইবারে পাঠায়।
4. AsyncSubject
AsyncSubject শুধুমাত্র শেষ emitted value পাঠায়, যখন complete() কল করা হয়। এটি শেষ মানটিকে সাবস্ক্রাইবারে পাঠানোর আগে সব ইভেন্টের প্রসেসিং শেষ করতে সহায়তা করে।
উদাহরণ: AsyncSubject
import { AsyncSubject } from 'rxjs';
const subject = new AsyncSubject();
// Subscriber 1
subject.subscribe(value => {
console.log('Subscriber 1:', value);
});
// Emitting values
subject.next('Value 1');
subject.next('Value 2');
// Complete the subject, after which the last emitted value is sent to subscribers
subject.complete(); // The last emitted value is sent to Subscriber 1
আউটপুট:
Subscriber 1: Value 2
এখানে, AsyncSubject শুধুমাত্র 'Value 2' পাঠিয়েছে, কারণ এটি complete() কল হওয়ার পর পরবর্তী মানটি সাবস্ক্রাইবারে পাঠায়।
3. Subject এর ব্যবহার
RxJS-এ Subject এর মাধ্যমে আপনি multicast করতে পারেন এবং একাধিক সাবস্ক্রাইবারকে একসাথে ডেটা পাঠাতে পারেন। এটি ব্যবহার করে, আপনি ইভেন্টগুলিকে সহজে প্রেরণ করতে পারেন এবং তাদের উপর কার্যকলাপ পরিচালনা করতে পারেন।
Example: Real-time Event Management with Subject
import { Subject } from 'rxjs';
const subject = new Subject();
// Event listener for user input
document.getElementById('input').addEventListener('input', (event) => {
subject.next(event.target.value); // Emit the input value
});
// Subscriber 1
subject.subscribe(value => {
console.log('Subscriber 1:', value);
});
// Subscriber 2
subject.subscribe(value => {
console.log('Subscriber 2:', value);
});
এখানে, Subject ব্যবহার করে আমরা input ইভেন্টের পরিবর্তনগুলিকে দুটি সাবস্ক্রাইবারের কাছে শেয়ার করছি।
সারাংশ
RxJS Subject এর প্রধান ভূমিকা হল multicasting—একটি একক Observable থেকে একাধিক সাবস্ক্রাইবারকে ডেটা শেয়ার করা। RxJS-এর মধ্যে বিভিন্ন ধরনের Subject রয়েছে, যেমন:
- Basic Subject: একটি সাধারণ Subject যা একাধিক সাবস্ক্রাইবারকে একই ডেটা পাঠায়।
- BehaviorSubject: সর্বশেষ মান সংরক্ষণ করে রাখে এবং নতুন সাবস্ক্রাইবারদের সেই মান পাঠায়।
- ReplaySubject: আগের মানগুলি সংরক্ষণ করে রাখে এবং সাবস্ক্রাইবারকে পাঠায়।
- AsyncSubject: শুধু শেষ মানটি পাঠায় যখন complete() কল হয়।
Subject এর মাধ্যমে RxJS স্ট্রিমগুলিকে আরও কার্যকরভাবে এবং সহজে ম্যানেজ করা সম্ভব হয়, বিশেষত যখন আপনি একাধিক সাবস্ক্রাইবারের কাছে একই ডেটা পাঠাতে চান বা ইভেন্ট-ভিত্তিক সিস্টেম তৈরি করতে চান।
Read more