Subjects হল RxJS-এর একটি বিশেষ ধরনের Observable যা multicasting সাপোর্ট করে। এটি সাধারণ Observables থেকে আলাদা কারণ একটি Subject একাধিক সাবস্ক্রাইবার (subscriber)কে একই ডেটা পাঠাতে সক্ষম, যা একটি সাধারণ Observable পারে না। Subjects এই বিষয়টি সমাধান করে এবং একাধিক সাবস্ক্রাইবারদের একযোগে ডেটা বা ইভেন্ট পাঠায়।
RxJS-এ Subject তিনটি প্রধান কাজ করে:
- Multicasting: একবার ডেটা প্রস্তুত হলে, এটি একাধিক সাবস্ক্রাইবারদের কাছে পাঠানো যায়।
- Event Dispatcher: বিভিন্ন ইউজার ইভেন্ট বা অ্যাসিঙ্ক্রোনাস কার্যক্রমকে পরিচালনা করতে এটি ব্যবহার করা যায়।
- Bridge Between Observables: দুটি বা তার বেশি Observable কে একত্রিত করতে Subject ব্যবহার করা যেতে পারে।
Subject এর উদাহরণ
import { Subject } from 'rxjs';
const subject = new Subject();
// Subscriber 1
subject.subscribe({
next: (v) => console.log(`Subscriber 1: ${v}`)
});
// Subscriber 2
subject.subscribe({
next: (v) => console.log(`Subscriber 2: ${v}`)
});
// Data emission
subject.next('Hello');
subject.next('World');
এই উদাহরণে, subject.next() দিয়ে ডেটা পাঠানোর মাধ্যমে এটি দুটি সাবস্ক্রাইবারের কাছে একই ডেটা পাঠায়। এখানে Subscriber 1 এবং Subscriber 2 উভয়ই "Hello" এবং "World" দেখতে পাবে।
BehaviorSubjects
BehaviorSubject হলো একটি বিশেষ ধরনের Subject যা একটি initial value ধারণ করে এবং যখনই কোনও সাবস্ক্রাইবার নতুন ভাবে সাবস্ক্রাইব করে, তখন তারা সেই initial value বা সর্বশেষ প্রেরিত মান পায়।
BehaviorSubject সাধারণ Subject থেকে আলাদা কারণ এটি সর্বশেষ মানকে মনে রাখে, এবং সেই মানকে সব নতুন সাবস্ক্রাইবারদের কাছে পাঠায়।
BehaviorSubject এর উদাহরণ
import { BehaviorSubject } from 'rxjs';
const behaviorSubject = new BehaviorSubject('Initial Value');
// Subscriber 1
behaviorSubject.subscribe({
next: (v) => console.log(`Subscriber 1: ${v}`)
});
// Data emission
behaviorSubject.next('Updated Value');
// Subscriber 2 (will receive the latest value 'Updated Value')
behaviorSubject.subscribe({
next: (v) => console.log(`Subscriber 2: ${v}`)
});
// Data emission
behaviorSubject.next('Another Value');
এখানে, যখন Subscriber 2 নতুন করে সাবস্ক্রাইব করে, তখন সে সর্বশেষ মান "Updated Value" পাবে, যা Subscriber 1 এর মাধ্যমে পাঠানো হয়েছিল।
বিভিন্ন ধরনের Subject
RxJS-এ বেশ কিছু ধরনের Subject রয়েছে, যার মধ্যে কিছু গুরুত্বপূর্ণ হলো:
- Subject: সাধারণ Subject যা কোনও মানের হিসাব রাখে না এবং শুধুমাত্র সাবস্ক্রাইবারদের কাছে ডেটা পাঠায়।
- BehaviorSubject: সর্বশেষ মানকে মনে রাখে এবং নতুন সাবস্ক্রাইবারদের সেই সর্বশেষ মান পাঠায়।
- ReplaySubject: এটি সাবস্ক্রাইবারদের কাছে নির্দিষ্ট সংখ্যক বা পুরো ইতিহাসের ডেটা পুনরায় পাঠায়। এটি সাবস্ক্রাইবারদের কাছে replay করতে সক্ষম।
- AsyncSubject: এটি কেবলমাত্র শেষ মানটি প্রদান করে যখন Observable সম্পূর্ণ হয়ে যায়। এটি শুধুমাত্র complete হবার পর সাবস্ক্রাইবারদের কাছে শেষ মান পাঠায়।
Subjects এবং BehaviorSubjects এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Subject | BehaviorSubject |
|---|---|---|
| Initial Value | থাকে না | থাকে |
| Data Retention | সর্বশেষ মান রাখে না | সর্বশেষ মান রাখে |
| Subscription Behavior | সাবস্ক্রাইব করার পর ডেটা পাওয়া যায় না, শুধুমাত্র পরবর্তী মানগুলো পাওয়া যায় | নতুন সাবস্ক্রাইবার সর্বশেষ মান পায় |
| Use Case | একাধিক সাবস্ক্রাইবারে একে অপরকে ডেটা পাঠানো | সর্বশেষ মান মনে রেখে নতুন সাবস্ক্রাইবারদের জানানো |
সারাংশ
RxJS-এর Subjects এবং BehaviorSubjects খুবই গুরুত্বপূর্ণ টুল যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং এবং ডেটা স্ট্রিমের পরিচালনা সহজ করে। Subject একাধিক সাবস্ক্রাইবারদের একই ডেটা পাঠানোর জন্য ব্যবহার করা হয়, যখন BehaviorSubject সর্বশেষ মান মনে রেখে নতুন সাবস্ক্রাইবারদের জানাতে ব্যবহৃত হয়। BehaviorSubject বিশেষভাবে উপকারী যখন আপনি সর্বশেষ ডেটা বা স্টেট সংরক্ষণ করতে চান এবং নতুন সাবস্ক্রাইবারদের সেই ডেটা স্বয়ংক্রিয়ভাবে প্রদান করতে চান।
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 স্ট্রিমগুলিকে আরও কার্যকরভাবে এবং সহজে ম্যানেজ করা সম্ভব হয়, বিশেষত যখন আপনি একাধিক সাবস্ক্রাইবারের কাছে একই ডেটা পাঠাতে চান বা ইভেন্ট-ভিত্তিক সিস্টেম তৈরি করতে চান।
RxJS (Reactive Extensions for JavaScript) এর মধ্যে বিভিন্ন ধরনের Subject রয়েছে, যার মাধ্যমে আমরা ডেটা বা ইভেন্ট স্ট্রিম তৈরি করতে পারি। Subject হলো একটি বিশেষ ধরনের Observable যা সাধারণভাবে Multicasting করতে ব্যবহৃত হয়, অর্থাৎ একাধিক সাবস্ক্রাইবারদের কাছে ডেটা পাঠাতে সক্ষম। তবে, BehaviorSubject, ReplaySubject, এবং AsyncSubject প্রতিটি কিছু আলাদা বৈশিষ্ট্য এবং আচরণ প্রদান করে। এই তিনটি ধরনের Subject এর মাধ্যমে আপনি ডেটা স্ট্রিমের বিভিন্ন পর্যায়ে সাবস্ক্রাইবারদেরকে ডেটা প্রদান করতে পারবেন। নিচে এই তিনটি Subject এর বিস্তারিত পরিচিতি দেওয়া হলো।
1. BehaviorSubject
BehaviorSubject একটি বিশেষ ধরনের Subject যা সর্বশেষ প্রাপ্ত মান বা অবস্থা স্টোর করে রাখে এবং নতুন সাবস্ক্রাইবারদের সেই মান প্রদান করে। এর মানে হলো, যখনই নতুন সাবস্ক্রাইবার যুক্ত হবে, সে সর্বশেষ প্রাপ্ত মানটি প্রথমেই পাবে এবং তারপর অন্য কোনো আপডেট পাওয়া শুরু করবে। এটি মূলত current value ধারণ করে।
বৈশিষ্ট্য:
- Initial value: BehaviorSubject শুরুতে একটি ইনিশিয়াল মান নিয়ে শুরু হয়, যা সাবস্ক্রাইবারদের কাছে সরবরাহ করা হয়।
- Last emitted value: যে কোনও সময় সর্বশেষ প্রাপ্ত মান স্টোর থাকে এবং নতুন সাবস্ক্রাইবারদের সর্বশেষ মান প্রদান করা হয়।
উদাহরণ:
import { BehaviorSubject } from 'rxjs';
const behaviorSubject = new BehaviorSubject('Initial Value'); // Initial value
// First subscriber
behaviorSubject.subscribe(value => console.log('Subscriber 1:', value));
// Emit new value
behaviorSubject.next('New Value');
// Second subscriber
behaviorSubject.subscribe(value => console.log('Subscriber 2:', value));
// Output:
// Subscriber 1: Initial Value
// Subscriber 1: New Value
// Subscriber 2: New Value
এখানে, Subscriber 2 সর্বশেষ মান 'New Value' পাবে, যদিও সে পরে সাবস্ক্রাইব করেছে।
2. ReplaySubject
ReplaySubject একটি Subject যা নির্দিষ্ট সংখ্যক পূর্ববর্তী মান "replay" (পুনরায় পাঠানো) করে সাবস্ক্রাইবারদের কাছে। এটি একটি ক্যাশের মতো কাজ করে, যেখানে আপনি কতগুলো আগের মান পুনরায় পাঠানো হবে তা নির্ধারণ করতে পারবেন।
বৈশিষ্ট্য:
- Buffer Size: ReplaySubject একটি buffer size ধারণ করে, যা নির্ধারণ করে কতটি পূর্ববর্তী মান সাবস্ক্রাইবারদের কাছে পাঠানো হবে।
- Replay all values: আপনি চাইলে সমস্ত মান বা নির্দিষ্ট সংখ্যক মান পুনরায় পাঠাতে পারেন।
উদাহরণ:
import { ReplaySubject } from 'rxjs';
const replaySubject = new ReplaySubject(2); // Buffer size 2
// First subscriber
replaySubject.subscribe(value => console.log('Subscriber 1:', value));
// Emit values
replaySubject.next('Value 1');
replaySubject.next('Value 2');
replaySubject.next('Value 3');
// Second subscriber
replaySubject.subscribe(value => console.log('Subscriber 2:', value));
// Output:
// Subscriber 1: Value 1
// Subscriber 1: Value 2
// Subscriber 1: Value 3
// Subscriber 2: Value 2
// Subscriber 2: Value 3
এখানে, Subscriber 2 শুধুমাত্র শেষ দুটি মান ('Value 2' এবং 'Value 3') পায়, কারণ ReplaySubject-এ buffer size 2 নির্ধারণ করা হয়েছিল।
3. AsyncSubject
AsyncSubject এমন একটি Subject যা শুধুমাত্র তার শেষ মানটি একটি সাবস্ক্রাইবারকে পাঠায়, এবং এটি তখনই করে যখন complete() কল করা হয়। এটি সাধারণত শেষ মান এবং তার পরবর্তী কোনো স্টেটের জন্য ব্যবহৃত হয়, যা ডেটা প্রবাহের শেষে সরবরাহ করা হয়।
বৈশিষ্ট্য:
- Only last value: AsyncSubject শুধুমাত্র শেষ মানটি সাবস্ক্রাইবারদের কাছে পাঠায়।
- Emits on complete: এটি শুধু তখনই মান প্রদান করে যখন complete() কল করা হয়।
উদাহরণ:
import { AsyncSubject } from 'rxjs';
const asyncSubject = new AsyncSubject();
// First subscriber
asyncSubject.subscribe(value => console.log('Subscriber 1:', value));
// Emit values
asyncSubject.next('Value 1');
asyncSubject.next('Value 2');
asyncSubject.next('Value 3');
// Complete the subject
asyncSubject.complete();
// Output:
// Subscriber 1: Value 3
এখানে, Subscriber 1 শুধুমাত্র শেষ মান 'Value 3' পায়, কারণ AsyncSubject শুধুমাত্র শেষ মানটি সাবস্ক্রাইবারদের কাছে পাঠায় এবং সেটি তখনই ঘটে যখন complete() কল করা হয়।
সারাংশ
- BehaviorSubject: সর্বশেষ মানটি সঞ্চয় করে রাখে এবং নতুন সাবস্ক্রাইবারদের সেই মান সরবরাহ করে। এটি একটি initial value গ্রহণ করে এবং সর্বশেষ প্রাপ্ত মানটি পুনরায় পাঠায়।
- ReplaySubject: পূর্ববর্তী মানগুলি ক্যাশে করে রাখে এবং নতুন সাবস্ক্রাইবারদের কাছে সেই মানগুলি পুনরায় পাঠায়। এটি buffer size দ্বারা নিয়ন্ত্রিত।
- AsyncSubject: শুধুমাত্র শেষ মানটি সাবস্ক্রাইবারদের কাছে পাঠায়, এবং এটি তখনই ঘটে যখন complete() কল করা হয়।
এই তিনটি Subject আপনাকে আলাদা আলাদা পরিস্থিতিতে ডেটা স্ট্রিমের মানগুলো পরিচালনা করতে সহায়তা করে, এবং আপনি যেখানে কোনটি ব্যবহার করবেন তা নির্ভর করে আপনার প্রোগ্রামের প্রয়োজনীয়তার উপর।
RxJS-এ Subject একটি বিশেষ ধরনের Observable যা শুধু ডেটা গ্রহণই নয়, সেই ডেটা অন্যান্য সাবস্ক্রাইবারদের মধ্যে শেয়ার করার জন্য ব্যবহৃত হয়। সাধারনত, একটি Observable ডেটা শুধুমাত্র সাবস্ক্রাইবারদের জন্য পাঠায়, কিন্তু Subject এমন একটি Observable যা একাধিক সাবস্ক্রাইবারের মধ্যে ডেটা শেয়ার করতে পারে। এটি পুশ এবং পুল মডেল দুটোই সাপোর্ট করে।
RxJS Subjects একাধিক প্রকারে আসে, এবং তাদের ব্যবহার কিছুটা আলাদা হতে পারে, তবে সাধারণভাবে এটি ডেটা শেয়ার এবং কমিউনিকেশন হ্যান্ডলিংয়ের জন্য খুবই উপকারী।
Subject কী?
Subject হল একটি বিশেষ ধরনের Observable, যা নিজে থেকে ডেটা তৈরি না করে, বরং এটি ডেটা push করে দেয় সমস্ত সাবস্ক্রাইবারদের কাছে। এটি আপনাকে একই ডেটা একাধিক সাবস্ক্রাইবারের মধ্যে শেয়ার করতে সাহায্য করে। আপনি যে কোন সময় একটি Subject তে নতুন মান পাঠাতে পারেন এবং তা সমস্ত সক্রিয় সাবস্ক্রাইবারদের কাছে পৌঁছাবে।
Subject ব্যবহার
আমরা নিচে একটি সাধারণ উদাহরণ দেখবো যেখানে একটি Subject ব্যবহার করা হবে, যা একাধিক সাবস্ক্রাইবারের মধ্যে ডেটা শেয়ার করবে।
১. Subject তৈরি ও ব্যবহার
import { Subject } from 'rxjs';
// একটি Subject তৈরি করা
const subject = new Subject();
// প্রথম সাবস্ক্রাইবার যোগ করা
subject.subscribe({
next: (value) => console.log('Subscriber 1 received: ', value)
});
// দ্বিতীয় সাবস্ক্রাইবার যোগ করা
subject.subscribe({
next: (value) => console.log('Subscriber 2 received: ', value)
});
// Subject তে মান পুশ করা
subject.next('Hello, RxJS!'); // এই মানটি সমস্ত সাবস্ক্রাইবারদের কাছে যাবে
subject.next('Welcome to Subjects!');
২. কোড ব্যাখ্যা
- Subject: এখানে আমরা একটি
Subjectতৈরি করেছি, যাnext()ফাংশন ব্যবহার করে ডেটা পুশ করবে। - subscribe(): দুইটি সাবস্ক্রাইবার যোগ করেছি। যখনই
subject.next()কল করা হবে, তখন এই মানটি দুটি সাবস্ক্রাইবারের কাছে পৌঁছাবে। - next(): এই ফাংশনের মাধ্যমে আমরা
Subjectতে ডেটা পাঠাচ্ছি, যা সমস্ত সাবস্ক্রাইবারদের কাছে চলে যাবে।
৩. আউটপুট
যখন উপরের কোডটি চালানো হবে, তখন কনসোলে আউটপুট হবে:
Subscriber 1 received: Hello, RxJS!
Subscriber 2 received: Hello, RxJS!
Subscriber 1 received: Welcome to Subjects!
Subscriber 2 received: Welcome to Subjects!
Subject এর প্রকারভেদ
RxJS এ বিভিন্ন ধরনের Subject রয়েছে, যা বিভিন্ন পরিস্থিতিতে ব্যবহৃত হতে পারে। নিচে তাদের কিছু গুরুত্বপূর্ণ প্রকার আলোচনা করা হলো:
১. BehaviorSubject
BehaviorSubject এমন একটি Subject যা সর্বদা সর্বশেষ পাঠানো মানটি ধারণ করে এবং নতুন সাবস্ক্রাইবারদের কাছে এটি সর্বশেষ মান পাঠায়। এটি সাধারণত ব্যবহৃত হয় যেখানে আপনি সর্বশেষ মানের অবস্থা শেয়ার করতে চান।
import { BehaviorSubject } from 'rxjs';
// একটি BehaviorSubject তৈরি করা
const behaviorSubject = new BehaviorSubject('Initial Value');
// সাবস্ক্রাইবার যোগ করা
behaviorSubject.subscribe({
next: (value) => console.log('Subscriber received: ', value)
});
// নতুন মান পুশ করা
behaviorSubject.next('New Value');
এখানে, প্রথম সাবস্ক্রাইবার যখন BehaviorSubject-এ সাবস্ক্রাইব করবে, তখন এটি সর্বশেষ মান "Initial Value" পাবে। এরপর যে কোন নতুন মান যোগ করলে, সেই মানটি সমস্ত সাবস্ক্রাইবারের কাছে পৌঁছে যাবে।
২. ReplaySubject
ReplaySubject এমন একটি Subject যা সাবস্ক্রাইবারদের কাছে অতীতের সমস্ত মান পুনরায় পাঠায়। আপনি এটি ব্যবহার করতে পারেন যখন আপনি চান সাবস্ক্রাইবাররা সব পুরানো মান দেখতে পাবে।
import { ReplaySubject } from 'rxjs';
// একটি ReplaySubject তৈরি করা
const replaySubject = new ReplaySubject(2); // সর্বশেষ ২টি মানই রেকর্ড হবে
// প্রথম সাবস্ক্রাইবার যোগ করা
replaySubject.subscribe({
next: (value) => console.log('Subscriber 1 received: ', value)
});
// মান পুশ করা
replaySubject.next('First Value');
replaySubject.next('Second Value');
replaySubject.next('Third Value');
// দ্বিতীয় সাবস্ক্রাইবার যোগ করা
replaySubject.subscribe({
next: (value) => console.log('Subscriber 2 received: ', value)
});
এখানে, দ্বিতীয় সাবস্ক্রাইবার সাবস্ক্রাইব করার পর, এটি সর্বশেষ দুটি মান (Second Value এবং Third Value) পাবো, যেহেতু ReplaySubject সর্বশেষ দুটি মান মেমোরিতে রাখে।
৩. AsyncSubject
AsyncSubject একটি বিশেষ ধরনের Subject যা শুধুমাত্র complete() হওয়ার পর শেষ মানটি পাঠায়। এটি সাধারণত ব্যবহৃত হয় যেখানে আপনি শুধুমাত্র শেষ মানের প্রতি আগ্রহী।
import { AsyncSubject } from 'rxjs';
// একটি AsyncSubject তৈরি করা
const asyncSubject = new AsyncSubject();
// সাবস্ক্রাইবার যোগ করা
asyncSubject.subscribe({
next: (value) => console.log('Subscriber received: ', value)
});
// মান পুশ করা
asyncSubject.next('First Value');
asyncSubject.next('Second Value');
asyncSubject.next('Third Value');
// শেষ মান পাঠানো এবং complete করা
asyncSubject.complete();
এখানে, AsyncSubject শুধুমাত্র complete() কল হওয়ার পর "Third Value" মানটি সাবস্ক্রাইবারকে পাঠাবে।
সারাংশ
RxJS Subjects হল একাধিক সাবস্ক্রাইবারের মধ্যে ডেটা শেয়ার করার জন্য একটি শক্তিশালী উপায়। সাধারণ Observable এর তুলনায়, Subjects আপনাকে ডেটা push করার মাধ্যমে সেটি একাধিক সাবস্ক্রাইবারের কাছে পৌঁছাতে সহায়তা করে। RxJS-এ বিভিন্ন ধরনের Subject থাকে, যেমন BehaviorSubject, ReplaySubject, এবং AsyncSubject, প্রতিটি তাদের নিজস্ব ব্যবহারের ক্ষেত্র অনুযায়ী কাজ করে। এগুলি একত্রে ব্যবহার করে আপনি অ্যাসিঙ্ক্রোনাস ডেটা স্ট্রিম এবং ইভেন্ট হ্যান্ডলিং আরও সহজভাবে পরিচালনা করতে পারবেন।
Multicasting এর ধারণা
Multicasting RxJS-এ একটি গুরুত্বপূর্ণ কনসেপ্ট যা একই Observable থেকে ডেটা বা ইভেন্ট একাধিক সাবস্ক্রাইবারকে পাঠানোর জন্য ব্যবহৃত হয়। সাধারণত, একটি Observable-এ একাধিক সাবস্ক্রাইবার থাকলে, প্রতিটি সাবস্ক্রাইবার আলাদাভাবে Observable থেকে ডেটা পায়। তবে, Multicasting ব্যবহার করে আপনি একই Observable থেকে ডেটা একাধিক সাবস্ক্রাইবারকে একবারে পাঠাতে পারেন, যার ফলে ডেটা প্রসেসিং আরও দক্ষ এবং অপ্টিমাইজড হয়।
Multicasting মূলত subject ব্যবহার করে অর্জন করা হয়। RxJS-এ Subject হল একটি বিশেষ ধরনের Observable যা ইভেন্ট বা ডেটা একাধিক সাবস্ক্রাইবারে সম্প্রচার করতে সক্ষম।
Multicasting এর প্রয়োজনীয়তা
- দ্রুত এবং দক্ষ ডেটা প্রেরণ:
যখন একাধিক সাবস্ক্রাইবার একই Observable থেকে ডেটা গ্রহণ করে, তখন সাধারণভাবে প্রত্যেকটি সাবস্ক্রাইবার আলাদাভাবে Observable থেকে ডেটা পায়। তবে multicasting ব্যবহার করলে ডেটা শুধুমাত্র একবার প্রসেস হয় এবং সেই ডেটা একাধিক সাবস্ক্রাইবারে পাঠানো হয়, যা সিস্টেমের কার্যকারিতা এবং পারফরম্যান্স উন্নত করে। - সংস্থান ব্যবস্থাপনা:
যদি একটি Observable বহু সাবস্ক্রাইবারের কাছে একাধিক বার ডেটা পাঠানোর জন্য একই কাজ পুনরাবৃত্তি করে, তবে এটি অপ্রয়োজনীয়ভাবে সম্পদ খরচ করতে পারে। Multicasting-এ, ডেটা একবারই প্রেরণ হয় এবং সব সাবস্ক্রাইবার একই ডেটা গ্রহণ করে, ফলে এটি সম্পদ ব্যবস্থাপনাকে আরও দক্ষ করে তোলে। - একাধিক সাবস্ক্রাইবারের মধ্যে ডেটা শেয়ারিং:
যখন একাধিক সাবস্ক্রাইবারকে একই ডেটা শেয়ার করতে হয়, তখন multicasting খুবই উপকারী। উদাহরণস্বরূপ, যদি বিভিন্ন UI কম্পোনেন্টের মধ্যে একই ডেটা শেয়ার করতে হয়, তাহলে multicasting ব্যবহার করলে একাধিক বার ডেটা রিকোয়েস্ট করার প্রয়োজন হয় না। এটি ইউজার ইন্টারফেসের রেসপন্সিভনেসও বাড়ায়। - কমপ্লেক্স স্ট্রিমগুলির ব্যবস্থাপনা:
অনেক সময়, একাধিক সাবস্ক্রাইবারের জন্য একাধিক ডেটা স্ট্রিম বা ইভেন্ট প্রয়োজন হয়। Multicasting ব্যবহার করে আপনি একাধিক সাবস্ক্রাইবারকে একত্রিত ডেটা বা ইভেন্টের প্রবাহ পাঠাতে পারেন, যা কার্যকরী এবং সহজ হয়।
RxJS-এ Multicasting এর বাস্তব উদাহরণ
RxJS-এ multicasting করতে আপনাকে সাধারণত Subject ব্যবহার করতে হবে। এখানে একটি উদাহরণ দেওয়া হলো যেখানে একটি Subject ব্যবহার করে একাধিক সাবস্ক্রাইবারের মধ্যে ডেটা শেয়ার করা হচ্ছে:
import { Subject } from 'rxjs';
const subject = new Subject();
// প্রথম সাবস্ক্রাইবার
subject.subscribe(data => {
console.log('Subscriber 1: ' + data);
});
// দ্বিতীয় সাবস্ক্রাইবার
subject.subscribe(data => {
console.log('Subscriber 2: ' + data);
});
// Observable থেকে ডেটা পাঠানো হচ্ছে
subject.next('Hello');
subject.next('World');
এই কোডে, Subject ব্যবহার করা হয়েছে, যাতে একই ডেটা দুটি আলাদা সাবস্ক্রাইবারে পাঠানো যায়। এখানে next() মেথড ব্যবহার করে ডেটা পাঠানো হচ্ছে এবং সব সাবস্ক্রাইবার একই ডেটা পাচ্ছে।
Multicasting এর জন্য অন্যান্য অপশন
RxJS-এ কিছু বিশেষ অপারেটর রয়েছে যা multicasting করতে সাহায্য করে:
share():
এটি একটি সহজ অপারেটর যা Observable-কে multicast করে। এটি একই Observable-এ একাধিক সাবস্ক্রাইবারকে ডেটা পাঠানোর জন্য একটি Subject ব্যবহার করে।উদাহরণ:
import { of } from 'rxjs'; import { share } from 'rxjs/operators'; const observable = of('Hello', 'World').pipe(share()); observable.subscribe(data => console.log('Subscriber 1: ' + data)); observable.subscribe(data => console.log('Subscriber 2: ' + data));এখানে,
share()ব্যবহার করে একাধিক সাবস্ক্রাইবারের মধ্যে ডেটা শেয়ার করা হয়েছে।publish():
এটি একটি বিশেষ ধরনের multicasting অপারেটর যা Observable-কে Subject এ রূপান্তরিত করে, এবং সাবস্ক্রাইবার যখন সাবস্ক্রাইব করে তখন ডেটা প্রাপ্তি শুরু হয়।উদাহরণ:
import { interval } from 'rxjs'; import { publish, take } from 'rxjs/operators'; const observable = interval(1000).pipe( take(5), publish() ); observable.subscribe(data => console.log('Subscriber 1: ' + data)); observable.subscribe(data => console.log('Subscriber 2: ' + data)); observable.connect(); // connect() কল করা না হলে, ডেটা প্রেরণ শুরু হবে নাএখানে,
publish()অপারেটরটি Observable-কে multicast করে এবংconnect()মেথডটি ডেটা পাঠানো শুরু করতে ব্যবহৃত হয়।
সারাংশ
Multicasting RxJS-এ একটি অত্যন্ত গুরুত্বপূর্ণ কনসেপ্ট, যা একাধিক সাবস্ক্রাইবারের মধ্যে একই ডেটা শেয়ার করতে ব্যবহৃত হয়। এটি কার্যকরীভাবে ডেটা প্রসেসিংয়ের দক্ষতা বৃদ্ধি করে এবং সিস্টেমের সম্পদ ব্যবস্থাপনা উন্নত করে। Subject, share(), এবং publish() অপারেটর ব্যবহার করে আপনি RxJS-এ multicasting করতে পারেন, যা ডেটার পুনরাবৃত্তি কমিয়ে দেয় এবং সিস্টেমের কার্যকারিতা উন্নত করে।
Read more