Higher-order Observables এর ধারণা

Advanced RxJS Techniques - আরএক্সজেএস (RxJS) - Web Development

275

RxJS (Reactive Extensions for JavaScript) অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের জন্য একটি শক্তিশালী লাইব্রেরি। Higher-order Observables হল এমন একটি ধারণা যেখানে একটি Observable ভিতরে আরেকটি Observable ধারণ করে। এটি একটি স্তরের Observable যে আরেকটি Observable কে emit করে, যার ফলে higher-order নামে পরিচিত। এই ধরনের অবজার্ভেবলগুলো সাধারণত অ্যাসিঙ্ক্রোনাস অপারেশনগুলির মধ্যে কিছু নির্দিষ্ট ক্রম বা লজিক তৈরি করার জন্য ব্যবহৃত হয়।


Higher-order Observable কী?

Higher-order Observable হল একটি Observable যা অন্য Observable কে emits করে। অর্থাৎ, এটি এমন একটি Observable যা ভেতরে আরেকটি Observable ধারণ করে। যখন আপনি সাবস্ক্রাইব করেন, তখন আপনি ওই ভেতরের Observable-এর মানগুলোর ওপর কাজ করতে পারেন।

এটি কার্যকরী যখন আপনি এমন পরিস্থিতিতে কাজ করছেন যেখানে একাধিক অ্যাসিঙ্ক্রোনাস অপারেশন একে অপরের ওপর নির্ভরশীল এবং আপনি তাদের প্রসেসিং অর্ডার বা স্ট্রিম সিঙ্ক্রোনাইজ করতে চান।

Higher-order Observable এর ব্যবহার

Higher-order Observable ব্যবহার করতে আপনি সাধারণত switchMap(), mergeMap(), concatMap(), exhaustMap() ইত্যাদি অপারেটর ব্যবহার করেন। এই অপারেটরগুলো উচ্চতর অবজার্ভেবলগুলোর মধ্যে মান আদান-প্রদান করতে এবং তাদের স্ট্রিম ম্যানেজ করতে সহায়তা করে।


Higher-order Observables এর উদাহরণ

1. switchMap() এর মাধ্যমে Higher-order Observable

switchMap() অপারেটরটি একটি উচ্চতর অবজার্ভেবলকে সাবস্ক্রাইব করতে এবং তার ভেতরের Observable কে একটি নতুন Observable এ মান রূপান্তর করতে ব্যবহৃত হয়। এটি আগের সাবস্ক্রিপশন বাতিল করে এবং নতুন সাবস্ক্রিপশনকে গ্রহণ করে।

উদাহরণ: switchMap() দিয়ে Higher-order Observable

import { of, interval } from 'rxjs';
import { switchMap, take } from 'rxjs/operators';

// প্রথম Observable: ১ সেকেন্ডে সংখ্যা পাঠাবে
const outerObservable = interval(1000).pipe(take(3));

outerObservable.pipe(
  switchMap(outerValue => {
    console.log('Outer Observable value:', outerValue);
    // ভিতরের Observable: ১ সেকেন্ডে সংখ্যা পাঠাবে
    return interval(500).pipe(take(3)); // Nested Observable
  })
).subscribe(innerValue => {
  console.log('Inner Observable value:', innerValue);
});

আউটপুট:

Outer Observable value: 0
Inner Observable value: 0
Inner Observable value: 1
Inner Observable value: 2
Outer Observable value: 1
Inner Observable value: 0
Inner Observable value: 1
Inner Observable value: 2
Outer Observable value: 2
Inner Observable value: 0
Inner Observable value: 1
Inner Observable value: 2

এখানে, switchMap() অপারেটরটি মূল outerObservable থেকে প্রতিটি মান গ্রহণ করছে এবং সেই মান অনুযায়ী একটি নতুন nested Observable (ভিতরের Observable) তৈরি করছে। আগের সাবস্ক্রিপশনটি বাতিল (cancel) হয়ে যায় এবং নতুন সাবস্ক্রিপশন শুরু হয়।


2. mergeMap() এর মাধ্যমে Higher-order Observable

mergeMap() অপারেটরটি একই সময়ে একাধিক Observable এর সাবস্ক্রিপশন চালু করতে সহায়তা করে। এটি একাধিক স্ট্রিমকে একসাথে চালায় এবং তাদের মানগুলোর ওপর কাজ করে।

উদাহরণ: mergeMap() দিয়ে Higher-order Observable

import { of, interval } from 'rxjs';
import { mergeMap, take } from 'rxjs/operators';

const outerObservable = of('First', 'Second', 'Third');

outerObservable.pipe(
  mergeMap(outerValue => {
    console.log('Outer value:', outerValue);
    // Nested Observable: ১ সেকেন্ডে সংখ্যা পাঠাবে
    return interval(500).pipe(take(3)); // Nested Observable
  })
).subscribe(innerValue => {
  console.log('Inner value:', innerValue);
});

আউটপুট:

Outer value: First
Inner value: 0
Inner value: 1
Inner value: 2
Outer value: Second
Inner value: 0
Inner value: 1
Inner value: 2
Outer value: Third
Inner value: 0
Inner value: 1
Inner value: 2

এখানে, mergeMap() অপারেটরটি প্রতিটি মানের জন্য একটি নতুন Observable তৈরি করেছে এবং সেই সব Observable গুলোকে একই সময়ে সাবস্ক্রাইব করে। এটি concurrent সাবস্ক্রিপশন চালানোর জন্য ব্যবহৃত হয়।


3. concatMap() এর মাধ্যমে Higher-order Observable

concatMap() অপারেটরটি একটি পর্যায়ক্রমিক higher-order observable এর জন্য ব্যবহৃত হয়। এটি সাবস্ক্রিপশনগুলোকে সিকোয়েন্সিয়ালি (sequentially) চালায়। অর্থাৎ, একটি সাবস্ক্রিপশন শেষ হলে পরবর্তীটি শুরু হয়।

উদাহরণ: concatMap() দিয়ে Higher-order Observable

import { of, interval } from 'rxjs';
import { concatMap, take } from 'rxjs/operators';

const outerObservable = of('First', 'Second', 'Third');

outerObservable.pipe(
  concatMap(outerValue => {
    console.log('Outer value:', outerValue);
    // Nested Observable: ১ সেকেন্ডে সংখ্যা পাঠাবে
    return interval(500).pipe(take(3)); // Nested Observable
  })
).subscribe(innerValue => {
  console.log('Inner value:', innerValue);
});

আউটপুট:

Outer value: First
Inner value: 0
Inner value: 1
Inner value: 2
Outer value: Second
Inner value: 0
Inner value: 1
Inner value: 2
Outer value: Third
Inner value: 0
Inner value: 1
Inner value: 2

এখানে, concatMap() অপারেটরটি প্রতিটি outerObservable এর মানের জন্য একটি নতুন nestedObservable তৈরি করছে এবং সেগুলোকে একের পর এক (sequentially) সাবস্ক্রাইব করছে।


4. exhaustMap() এর মাধ্যমে Higher-order Observable

exhaustMap() অপারেটরটি তখন ব্যবহৃত হয় যখন আপনি চান যে কোনো নতুন observable সাবস্ক্রাইব করার আগে পূর্ববর্তী সাবস্ক্রিপশনটি শেষ হয়ে যাক। এটি নতুন সাবস্ক্রিপশন গ্রহণ করার আগে আগের সাবস্ক্রিপশনটি শেষ হওয়ার জন্য অপেক্ষা করে।

উদাহরণ: exhaustMap() দিয়ে Higher-order Observable

import { of, interval } from 'rxjs';
import { exhaustMap, take } from 'rxjs/operators';

const outerObservable = of('First', 'Second', 'Third');

outerObservable.pipe(
  exhaustMap(outerValue => {
    console.log('Outer value:', outerValue);
    // Nested Observable: ১ সেকেন্ডে সংখ্যা পাঠাবে
    return interval(500).pipe(take(3)); // Nested Observable
  })
).subscribe(innerValue => {
  console.log('Inner value:', innerValue);
});

আউটপুট:

Outer value: First
Inner value: 0
Inner value: 1
Inner value: 2
Outer value: Second
Inner value: 0
Inner value: 1
Inner value: 2
Outer value: Third
Inner value: 0
Inner value: 1
Inner value: 2

এখানে, exhaustMap() অপারেটরটি শুধুমাত্র প্রথম observable সাবস্ক্রাইব করছে এবং পরবর্তী observable গুলোর সাবস্ক্রিপশন গ্রহণ করবে না যতক্ষণ না আগেরটি শেষ হয়।


Higher-order Observables এর সুবিধা

  1. Multiple Layers of Asynchronous Data: Higher-order Observables ব্যবহারের মাধ্যমে আপনি অ্যাসিঙ্ক্রোনাস ডেটা প্রক্রিয়া করতে পারেন যেখানে একাধিক ডেটা স্ট্রিম একে অপরের ওপর নির্ভরশীল হতে পারে।
  2. Nested Operations: আপনি একাধিক nested operation এক্সিকিউট করতে পারেন, যেমন একটি HTTP রিকোয়েস্টের ফলস্বরূপ আরেকটি HTTP রিকোয়েস্ট বা ইভেন্ট।
  3. Better Control of Subscription Flow: Higher-order Observables আপনাকে সাবস্ক্রিপশনের ফ্লো (সিকোয়েন্সিয়ালি বা concurently) নিয়ন্ত্রণ করতে সহায়তা করে।

সারাংশ

Higher-order Observables হল RxJS এর একটি গুরুত্বপূর্ণ ধারণা যেখানে একটি Observable অন্য একটি Observable কে emits করে। এই ধরনের স্ট্রিমগুলির জন্য আপনি switchMap(), mergeMap(), concatMap(), exhaustMap() অপারেটর ব্যবহার করতে পারেন। এগুলি অ্যাসিঙ্ক্রোনাস স্ট্রিমের মধ্যে উচ্চতর স্তরের ডেটা প্রক্রিয়া করার জন্য ব্যবহৃত হয়। Higher-order Observables ব্যবহারের মাধ্যমে, আপনি বিভিন্ন অ্যাসিঙ্ক্রোনাস অপারেশনগুলির মধ্যে সঠিক সিঙ্ক্রোনাইজেশন এবং প্রতিক্রিয়া নিশ্চিত করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...