RxJS (Reactive Extensions for JavaScript) একটি শক্তিশালী লাইব্রেরি যা Observables এবং Operators ব্যবহার করে অ্যাসিঙ্ক্রোনাস ডেটা স্ট্রিম এবং ইভেন্টগুলোকে পরিচালনা করতে সাহায্য করে। তবে, কিছু ক্ষেত্রে আমাদের একাধিক সাবস্ক্রাইবারকে একই ডেটা পাঠাতে হয়, অর্থাৎ Multicasting করতে হয়। Subjects হল এমন একটি উপাদান যা Multicasting পরিচালনা করতে ব্যবহৃত হয়। এটি একটি বিশেষ ধরনের Observable যা একাধিক সাবস্ক্রাইবারকে একই ডেটা প্রদান করতে পারে।
এখানে, আমরা আলোচনা করবো RxJS Subjects এবং তাদের মাধ্যমে কিভাবে Multicasting করা যায়।
Subjects এর মৌলিক ধারণা
Subject হল একটি Observable এবং একই সময়ে এটি একটি Observer (অথবা সাবস্ক্রাইবার) হিসেবে কাজ করে। এটি ডেটা বা ইভেন্টের স্ট্রিম একাধিক সাবস্ক্রাইবারে পাঠানোর কাজ করে এবং একই Observable-এর মাধ্যমে একাধিক সাবস্ক্রাইবারদের ডেটা প্রদান করতে সক্ষম।
এছাড়া, Subject কেবল একটি স্ট্রিমের মাধ্যমে একাধিক সাবস্ক্রাইবারদের ডেটা পাঠানোর জন্য ব্যবহৃত হয়, এবং এটি Multicasting প্যাটার্নে কাজ করে।
Types of Subjects in RxJS
RxJS-এ কিছু ধরনের Subject রয়েছে, যা বিভিন্ন পরিস্থিতিতে ব্যবহৃত হয়। প্রধান তিনটি ধরনের Subject হলো:
- Subject
- BehaviorSubject
- ReplaySubject
- AsyncSubject
আমরা এখানে প্রধানত Subject এর মাধ্যমে Multicasting নিয়ে আলোচনা করবো, এবং পরে অন্যান্য ধরনের Subject এর মধ্যে পার্থক্য নিয়ে আলোচনা করা হবে।
1. Basic Subject
Subject হল একটি সাধারণ Observable যা একাধিক সাবস্ক্রাইবারকে একই ডেটা পাঠাতে পারে। একটি Subject ডেটা পাঠানোর পরে একাধিক সাবস্ক্রাইবার তাদের ডেটা পেতে পারে।
উদাহরণ:
import { Subject } from 'rxjs';
const subject = new Subject();
// First subscriber
subject.subscribe({
next: (value) => console.log(`Subscriber 1 received: ${value}`)
});
// Second subscriber
subject.subscribe({
next: (value) => console.log(`Subscriber 2 received: ${value}`)
});
// Emitting values
subject.next('Hello');
subject.next('World');
আউটপুট:
Subscriber 1 received: Hello
Subscriber 2 received: Hello
Subscriber 1 received: World
Subscriber 2 received: World
এখানে, Subject এর মাধ্যমে দুটি সাবস্ক্রাইবার একই ডেটা ('Hello' এবং 'World') পেয়েছে। Multicasting এর ফলে, একবার ডেটা প্রেরণ করার পর সেটি একাধিক সাবস্ক্রাইবারে বিতরণ হয়ে গেছে।
2. BehaviorSubject
BehaviorSubject একটি বিশেষ ধরনের Subject, যা সর্বশেষ পাওয়া মানটি রাখতে সক্ষম। এটি একটি প্রাথমিক (initial) মান নেয় এবং সাবস্ক্রাইবাররা সর্বশেষ মান বা স্ট্রিমের মান পান।
বৈশিষ্ট্য:
- এটি সর্বশেষ মানটি সংরক্ষণ করে।
- যখন নতুন সাবস্ক্রাইবার যোগ হয়, তখন সেটি সর্বশেষ মানটি পেয়ে থাকে।
উদাহরণ:
import { BehaviorSubject } from 'rxjs';
const subject = new BehaviorSubject('Initial value');
// First subscriber
subject.subscribe({
next: (value) => console.log(`Subscriber 1 received: ${value}`)
});
// Emitting values
subject.next('New value');
// Second subscriber
subject.subscribe({
next: (value) => console.log(`Subscriber 2 received: ${value}`)
});
subject.next('Another value');
আউটপুট:
Subscriber 1 received: Initial value
Subscriber 1 received: New value
Subscriber 2 received: New value
Subscriber 1 received: Another value
Subscriber 2 received: Another value
এখানে, প্রথম সাবস্ক্রাইবার যখন subject.next('New value') পাঠিয়েছে, তখন BehaviorSubject সর্বশেষ মানটি সংরক্ষণ করে রাখে। দ্বিতীয় সাবস্ক্রাইবার যোগ করার পর, সে 'New value' পেয়েছে, কারণ BehaviorSubject সর্বশেষ মানটি সংরক্ষণ করে।
3. ReplaySubject
ReplaySubject একটি শক্তিশালী ধরনের Subject যা সর্বশেষ N মান বা একটি নির্দিষ্ট সংখ্যক মান সংরক্ষণ করে রাখে এবং যেকোনো নতুন সাবস্ক্রাইবারকে সেই মানগুলি পাঠায়। এটি নির্দিষ্ট সংখ্যক ইতিহাস বা মানকে রিকল (recall) করতে ব্যবহৃত হয়।
বৈশিষ্ট্য:
- সর্বশেষ N মান সংরক্ষণ করে এবং নতুন সাবস্ক্রাইবারদের সেগুলি পাঠায়।
- Buffer size কনফিগার করতে পারেন, যেমন সর্বশেষ ২ বা ৩ মান।
উদাহরণ:
import { ReplaySubject } from 'rxjs';
const subject = new ReplaySubject(2); // Buffer size is 2
// First subscriber
subject.subscribe({
next: (value) => console.log(`Subscriber 1 received: ${value}`)
});
// Emitting values
subject.next('First value');
subject.next('Second value');
subject.next('Third value');
// Second subscriber
subject.subscribe({
next: (value) => console.log(`Subscriber 2 received: ${value}`)
});
subject.next('Fourth value');
আউটপুট:
Subscriber 1 received: First value
Subscriber 1 received: Second value
Subscriber 1 received: Third value
Subscriber 2 received: Second value
Subscriber 2 received: Third value
Subscriber 1 received: Fourth value
Subscriber 2 received: Fourth value
এখানে, ReplaySubject প্রথমে ৩টি মান ('First value', 'Second value', 'Third value') প্রেরণ করেছে এবং নতুন সাবস্ক্রাইবার Subscriber 2 সর্বশেষ ২টি মান পেয়েছে (সর্বশেষ ২টি মান সংরক্ষিত থাকে, কারণ ReplaySubject(2) নির্ধারণ করা হয়েছে)।
4. AsyncSubject
AsyncSubject হল এমন একটি ধরনের Subject যা শুধুমাত্র স্ট্রিমের শেষ মান প্রদান করে। এটি complete() হওয়ার পরেই, সকল সাবস্ক্রাইবারকে শেষ মান পাঠায়।
বৈশিষ্ট্য:
- শুধুমাত্র স্ট্রিম শেষ হলে সর্বশেষ মানটি পাঠানো হয়।
উদাহরণ:
import { AsyncSubject } from 'rxjs';
const subject = new AsyncSubject();
// First subscriber
subject.subscribe({
next: (value) => console.log(`Subscriber 1 received: ${value}`)
});
subject.next('First value');
subject.next('Second value');
subject.next('Third value');
subject.complete(); // Complete the stream
// Second subscriber
subject.subscribe({
next: (value) => console.log(`Subscriber 2 received: ${value}`)
});
আউটপুট:
Subscriber 1 received: Third value
Subscriber 2 received: Third value
এখানে, AsyncSubject শুধুমাত্র শেষ মান ('Third value') সাবস্ক্রাইবারদের পাঠিয়েছে, কারণ স্ট্রিম complete() হওয়ার পরেই মানটি পাঠানো হয়েছে।
Summary: Subjects and Multicasting
- Subject: এটি একটি সাধারণ Observable যা একাধিক সাবস্ক্রাইবারকে একই ডেটা পাঠাতে সাহায্য করে। এটি multicasting-এ ব্যবহৃত হয়।
- BehaviorSubject: সর্বশেষ মান সংরক্ষণ করে এবং নতুন সাবস্ক্রাইবারদের সেই মানটি পাঠায়।
- ReplaySubject: সর্বশেষ N মান সংরক্ষণ করে এবং সাবস্ক্রাইবারদের সেগুলি পাঠায়, যখন তারা সাবস্ক্রাইব করে।
- AsyncSubject: শুধুমাত্র স্ট্রিম complete() হওয়ার পরেই, শেষ মানটি সাবস্ক্রাইবারদের পাঠায়।
এই সব ধরনের Subjects আপনি বিভিন্ন পরিস্থিতিতে ব্যবহার করতে পারেন, যেমন:
- Multicasting: একাধিক সাবস্ক্রাইবারকে একই ডেটা পাঠানোর জন্য।
- State Sharing: একাধিক অংশে একই ডেটা বা স্টেট শেয়ার করতে।
- Error Handling: একাধিক সাবস্ক্রাইবারদের মধ্যে error propagation করতে।
RxJS Subjects দিয়ে আপনি আপনার অ্যাপ্লিকেশনে multicasting কার্যক্রম সহজভাবে পরিচালনা করতে পারেন।
Read more