RxJS-এ Operators এমন ফাংশন যা Observable ডেটা স্ট্রিমের উপর কাজ করে, এবং তাদের বিভিন্ন ধরনের অপারেশন করতে সহায়ক। এই অপারেটরগুলোকে সাধারণত পাঁচটি মূল শ্রেণীতে ভাগ করা যায়: Transformation, Filtering, Combination, Error Handling, এবং Utility।
এখানে এই অপারেটরগুলির প্রতিটির ব্যাখ্যা এবং কিছু উদাহরণ দেওয়া হলো।
Transformation Operators
Transformation operators একটি Observable-এর মান পরিবর্তন বা রূপান্তর করতে ব্যবহৃত হয়। এর মাধ্যমে আপনি আসা ডেটাকে একটি নতুন ফর্ম্যাটে পরিবর্তন করতে পারেন, যেমন একটি মানকে ম্যাপ করা বা অ্যারে তৈরির জন্য রূপান্তর করা।
- map(): এটি একটি মানকে পরিবর্তন করে একটি নতুন মান তৈরি করে।
- pluck(): এটি একটি নির্দিষ্ট প্রপার্টি থেকে মান বের করে।
- scan(): এটি একটি অ্যাকুমুলেটর ফাংশন প্রয়োগ করে ক্রমান্বয়ে মান সংগ্রহ করে।
উদাহরণ:
import { of } from 'rxjs';
import { map } from 'rxjs/operators';
const observable = of(1, 2, 3);
observable.pipe(
map(x => x * 10)
).subscribe(console.log);
এখানে, map() অপারেটরটি প্রতিটি মানকে ১০ গুণে রূপান্তর করবে, এবং আউটপুট হবে 10, 20, 30।
Filtering Operators
Filtering operators কোনো Observable থেকে নির্দিষ্ট শর্ত অনুযায়ী ডেটা ফিল্টার বা নির্বাচন করতে ব্যবহৃত হয়। এটি বিশেষভাবে ব্যবহার হয় যখন আপনি কিছু ডেটা প্রক্রিয়া করতে চান যা একটি নির্দিষ্ট শর্ত পূরণ করে।
- filter(): এটি একটি নির্দিষ্ট শর্তের ওপর ভিত্তি করে মান ফিল্টার করে।
- take(): এটি শুধুমাত্র প্রথম N সংখ্যক মান গ্রহণ করে।
- distinct(): এটি ডুপ্লিকেট মানগুলো বাদ দেয়।
উদাহরণ:
import { of } from 'rxjs';
import { filter } from 'rxjs/operators';
const observable = of(1, 2, 3, 4, 5);
observable.pipe(
filter(x => x % 2 === 0) // শুধু even সংখ্যা
).subscribe(console.log);
এখানে, filter() অপারেটরটি শুধুমাত্র even সংখ্যা গুলোই নির্বাচন করবে এবং আউটপুট হবে 2, 4।
Combination Operators
Combination operators একাধিক Observable-কে একত্রিত করতে ব্যবহৃত হয়। এটি আপনাকে বিভিন্ন স্ট্রিম একত্রিত বা সমন্বিতভাবে পরিচালনা করতে সাহায্য করে।
- merge(): এটি একাধিক Observable কে একত্রিত করে, যেগুলি প্যারালালভাবে চলে।
- concat(): এটি একাধিক Observable কে একত্রিত করে কিন্তু একে একে একটার পর একটি চালানো হয়।
- combineLatest(): এটি একাধিক Observable থেকে সর্বশেষ মান নিয়ে কাজ করে।
উদাহরণ:
import { of } from 'rxjs';
import { merge } from 'rxjs/operators';
const obs1 = of(1, 2);
const obs2 = of(3, 4);
obs1.pipe(
merge(obs2)
).subscribe(console.log);
এখানে, merge() অপারেটরটি দুটি Observable কে একত্রিত করে এবং আউটপুট হবে 1, 2, 3, 4।
Error Handling Operators
Error handling operators ব্যবহৃত হয় যখন কোনো Observable এর মধ্যে ত্রুটি (error) ঘটে। এই অপারেটরগুলো দ্বারা ত্রুটির ক্ষেত্রেও কার্যক্রম চালানো সম্ভব হয় এবং প্রোগ্রামটি ক্র্যাশ না হয়ে চলতে থাকে।
- catchError(): এটি একটি ত্রুটি ধরতে এবং অন্য একটি Observable দিয়ে পুনরায় চেষ্টা করতে সাহায্য করে।
- retry(): এটি ত্রুটি ঘটলে পুনরায় অপারেশনটি চালাতে সাহায্য করে।
উদাহরণ:
import { of } from 'rxjs';
import { catchError } from 'rxjs/operators';
const observable = new Observable(subscriber => {
subscriber.next('Data 1');
subscriber.error('Something went wrong');
});
observable.pipe(
catchError(error => of('Recovered from error')) // ত্রুটি ঘটলে নতুন Observable দিয়ে রিপ্লেস
).subscribe(console.log);
এখানে, catchError() ত্রুটির পর একটি নতুন Observable of('Recovered from error') প্রদান করবে এবং আউটপুট হবে 'Recovered from error'।
Utility Operators
Utility operators কিছু কমন কার্যকলাপ সম্পাদন করতে ব্যবহৃত হয়, যেমন টেম্পোরারি ডিলের জন্য বা ডেটার লগিং করার জন্য। এগুলো কোডের ব্যবহারে আরও কার্যকরী হতে সাহায্য করে।
- tap(): এটি Observable এর মধ্যবর্তী কোনো পর্যায়ে কার্যকলাপ (যেমন লগিং) করার জন্য ব্যবহৃত হয়, কিন্তু এটি Observable-এর মূল প্রবাহ পরিবর্তন করে না।
- finalize(): এটি সম্পূর্ণ হওয়ার পর কোনো ফাংশন চালানোর জন্য ব্যবহৃত হয় (যেমন ক্লিনআপ কোড)।
উদাহরণ:
import { of } from 'rxjs';
import { tap } from 'rxjs/operators';
const observable = of(1, 2, 3);
observable.pipe(
tap(value => console.log('Value:', value)) // মান গুলোর লগিং
).subscribe(console.log);
এখানে, tap() অপারেটরটি প্রতি মানের জন্য লগ প্রিন্ট করবে, এবং আউটপুট হবে:
Value: 1
1
Value: 2
2
Value: 3
3
সারাংশ
RxJS-এ Operators এর বিভিন্ন শ্রেণী রয়েছে, যেমন Transformation, Filtering, Combination, Error Handling, এবং Utility। প্রতিটি শ্রেণীর অপারেটর আলাদা আলাদা উদ্দেশ্য সম্পাদন করে এবং Observable ডেটার ওপর নানা ধরনের কার্যক্রম পরিচালনা করে। এই অপারেটরগুলো আপনাকে আরও ক্ষমতাশালী, রিয়্যাক্টিভ, এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং করতে সহায়ক হয়।
Read more