RxJS-এ transformation operators ডেটার স্ট্রিমকে একটি নির্দিষ্ট রূপে পরিবর্তন করতে ব্যবহৃত হয়। এর মধ্যে switchMap(), concatMap(), এবং mergeMap() হল তিনটি গুরুত্বপূর্ণ অপারেটর, যেগুলি অ্যাসিঙ্ক্রোনাস অপারেশন এবং স্ট্রিমের সাথে কাজ করার সময় আপনাকে সুবিধা প্রদান করে। এই অপারেটরগুলো বিশেষভাবে গুরুত্বপূর্ণ যখন আপনার কাছে একাধিক Observable এবং অ্যাসিঙ্ক্রোনাস কার্যক্রম থাকে এবং আপনি তাদের সাথে একটি নির্দিষ্ট কৌশলে কাজ করতে চান।
এই অপারেটরগুলোর মধ্যে প্রধান পার্থক্য হচ্ছে কিভাবে তারা আগের স্ট্রিমের সাথে নতুন স্ট্রিমগুলিকে ম্যানেজ করে এবং কিভাবে তারা সাবস্ক্রাইবারদের কাছে ডেটা প্রেরণ করে।
1. switchMap()
switchMap() একটি ট্রান্সফরমেশন অপারেটর যা প্রতিটি ইনপুট ভ্যালুর জন্য একটি নতুন Observable তৈরি করে এবং পুরনো Observable-এর সাবস্ক্রিপশন বন্ধ করে দেয়। এটি সাধারণত ব্যবহৃত হয় যখন আপনি নতুন সাবস্ক্রিপশন তৈরি করতে চান এবং আগেরটি বাতিল করতে চান। এটি বিশেষভাবে ব্যবহারী যখন আপনি অ্যাসিঙ্ক্রোনাস ইভেন্ট বা API কল ইত্যাদি পরিচালনা করছেন এবং পুরনো কলগুলি আর প্রয়োজন নেই।
বৈশিষ্ট্য:
- প্রতিটি ইনপুট ভ্যালুর জন্য একটি নতুন Observable তৈরি করে।
- আগের Observable-এর সাবস্ক্রিপশন বন্ধ করে দেয়।
- এটি পূর্ববর্তী ডেটা স্ট্রিম-এর উপর নতুন স্ট্রিমের কাজকে অগ্রাধিকার দেয়।
উদাহরণ:
import { of } from 'rxjs';
import { switchMap } from 'rxjs/operators';
const source$ = of('A', 'B', 'C');
source$.pipe(
switchMap(val => {
console.log('Switching to new Observable with value:', val);
return of(val + '1', val + '2'); // A new observable for each input
})
).subscribe(result => console.log(result));
// Output:
// Switching to new Observable with value: A
// A1
// A2
// Switching to new Observable with value: B
// B1
// B2
// Switching to new Observable with value: C
// C1
// C2
এখানে, যখন একটি নতুন মান আসছে, আগের মানের Observable বাতিল হয়ে নতুন Observable সাবস্ক্রাইব করা হচ্ছে।
2. concatMap()
concatMap() একটি ট্রান্সফরমেশন অপারেটর যা প্রতি ইনপুট ভ্যালুতে একটি নতুন Observable তৈরি করে, এবং প্রত্যেকটি Observable সাবস্ক্রাইব করার জন্য একে একে আসতে থাকে। এটি নিশ্চিত করে যে আগের Observable শেষ না হওয়া পর্যন্ত নতুন Observable শুরু হবে না, অর্থাৎ সমস্ত সাবস্ক্রিপশন একটি সিরিয়াল (sequential) অর্ডারে সম্পন্ন হবে।
বৈশিষ্ট্য:
- প্রতিটি ইনপুট ভ্যালুতে একটি নতুন Observable তৈরি হয়।
- পূর্ববর্তী Observable সম্পূর্ণ না হওয়া পর্যন্ত নতুন Observable শুরু হয় না।
- এটি সিরিয়াল প্রক্রিয়া বজায় রাখে, অর্থাৎ সাবস্ক্রাইবারগুলিকে একে একে ডেটা প্রদান করা হয়।
উদাহরণ:
import { of } from 'rxjs';
import { concatMap } from 'rxjs/operators';
const source$ = of('A', 'B', 'C');
source$.pipe(
concatMap(val => {
console.log('Processing value:', val);
return of(val + '1', val + '2');
})
).subscribe(result => console.log(result));
// Output:
// Processing value: A
// A1
// A2
// Processing value: B
// B1
// B2
// Processing value: C
// C1
// C2
এখানে, concatMap() প্রতিটি মানের জন্য একটি নতুন Observable তৈরি করছে এবং এই Observable গুলো সিরিয়ালি প্রক্রিয়া করছে, অর্থাৎ একটি Observable সম্পূর্ণ না হওয়া পর্যন্ত পরবর্তী Observable শুরু হচ্ছে না।
3. mergeMap()
mergeMap() একটি ট্রান্সফরমেশন অপারেটর যা প্রতি ইনপুট ভ্যালুর জন্য একটি নতুন Observable তৈরি করে, এবং সমস্ত Observable গুলোকে সমান্তরালভাবে (concurrently) সাবস্ক্রাইব করতে দেয়। এটি একটি অসীম বা সীমাহীন সংখ্যক অ্যাসিঙ্ক্রোনাস অপারেশন একসাথে পরিচালনা করতে ব্যবহৃত হয়। তবে, এতে সাবস্ক্রিপশনগুলোর অর্ডার সংরক্ষিত থাকে না, অর্থাৎ ডেটা সবসময় আসতে আসতে থাকে।
বৈশিষ্ট্য:
- প্রতিটি ইনপুট ভ্যালুর জন্য একটি নতুন Observable তৈরি হয়।
- সমস্ত Observable গুলো একসাথে (concurrently) সাবস্ক্রাইব হয়।
- এতে অর্ডার সংরক্ষিত থাকে না।
উদাহরণ:
import { of } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
const source$ = of('A', 'B', 'C');
source$.pipe(
mergeMap(val => {
console.log('Processing value:', val);
return of(val + '1', val + '2');
})
).subscribe(result => console.log(result));
// Output:
// Processing value: A
// A1
// A2
// Processing value: B
// B1
// B2
// Processing value: C
// C1
// C2
এখানে, mergeMap() সব Observable গুলোকে একসাথে সাবস্ক্রাইব করে, অর্থাৎ সমস্ত স্ট্রিম একসাথে প্রক্রিয়া হয় এবং কোন নির্দিষ্ট অর্ডার বজায় থাকে না।
পার্থক্য - switchMap(), concatMap(), mergeMap()
| বৈশিষ্ট্য | switchMap() | concatMap() | mergeMap() |
|---|---|---|---|
| স্ট্রিমের আচরণ | আগের স্ট্রিম বাতিল করে নতুন স্ট্রিম শুরু | আগের স্ট্রিম সম্পূর্ণ না হলে নতুন স্ট্রিম শুরু হয় না | সকল স্ট্রিম সমান্তরালভাবে চালানো হয় |
| স্ট্রিমের অর্ডার | নতুন স্ট্রিম সব সময় প্রাধান্য পায় | স্ট্রিমগুলির অর্ডার রক্ষা করা হয় | স্ট্রিমগুলির অর্ডার রক্ষা করা হয় না |
| ব্যবহার | যখন আগের কাজটি আর প্রয়োজন নেই, নতুন কাজ শুরু করতে হয় | যখন কাজগুলো সিরিয়ালভাবে সম্পন্ন করতে হয় | যখন একাধিক কাজ একসাথে সম্পন্ন করতে হয় |
| পরীক্ষা | HTTP রিকোয়েস্ট বা একাধিক API কল, যেখানে আগের কল বাতিল করতে হয় | ফাইল আপলোড, যেখানে প্রতিটি কাজ শেষে পরবর্তী কাজ শুরু হয় | বহু অ্যাসিঙ্ক্রোনাস ইভেন্ট বা কল একসাথে প্রক্রিয়া করতে |
সারাংশ
switchMap(), concatMap(), এবং mergeMap() RxJS-এ গুরুত্বপূর্ণ transformation operators, যেগুলি আপনার অ্যাসিঙ্ক্রোনাস স্ট্রিম পরিচালনা করার পদ্ধতি ভিন্নভাবে পরিবর্তন করে।
switchMap()ব্যবহার করা হয় যখন আপনি আগের স্ট্রিমটি বাতিল করে নতুন স্ট্রিমকে অগ্রাধিকার দিতে চান।concatMap()ব্যবহার করা হয় যখন আপনি প্রতিটি Observable সাবস্ক্রাইব করার জন্য সিরিয়াল অর্ডার বজায় রাখতে চান।mergeMap()ব্যবহার করা হয় যখন আপনি একাধিক অ্যাসিঙ্ক্রোনাস কাজ সমান্তরালভাবে (concurrently) পরিচালনা করতে চান।
এই অপারেটরগুলো আপনাকে অ্যাসিঙ্ক্রোনাস এবং ইভেন্ট-ভিত্তিক প্রোগ্রামিং এর ক্ষেত্রে আরও শক্তিশালী এবং নমনীয় কোড লেখার সুযোগ দেয়।
Read more