tap() এবং এর প্রয়োগ

Utility Operators - আরএক্সজেএস (RxJS) - Web Development

288

RxJS (Reactive Extensions for JavaScript) একটি শক্তিশালী লাইব্রেরি যা অ্যাসিঙ্ক্রোনাস ডেটা এবং ইভেন্ট স্ট্রিমের সাথে কাজ করতে ব্যবহৃত হয়। tap() অপারেটরটি একটি বিশেষ ধরনের অপারেটর, যা মূল Observable এর ডেটা প্রক্রিয়াকরণের সময় কোন পরিবর্তন ছাড়া সাইড-ইফেক্ট (side-effects) বা লোকাল অপারেশন করতে ব্যবহৃত হয়। এটি মূল স্ট্রিমের ডেটাকে পরিবর্তন না করে শুধুমাত্র side-effects পরিচালনা করতে সাহায্য করে, যেমন লগিং, পর্যালোচনা, বা ডিবাগিং।

tap() অপারেটরটি ডেটার মাধ্যমে কিছু কাজ করার জন্য ব্যবহৃত হয় যেমন ডেটা রেকর্ড করা বা কনসোল লগ করা, কিন্তু এটি মূল স্ট্রিমে কোনো পরিবর্তন আনে না। এটি side-effect অপারেটর হিসেবে পরিচিত।


tap() এর বৈশিষ্ট্য

  • Side Effects: tap() মূল Observable এর ডেটাতে কোনো পরিবর্তন না এনে, সেটির সাইড-ইফেক্ট তৈরি করে (যেমন লগিং, ডিবাগিং, অথবা সিস্টেমে কিছু রেকর্ড করা)।
  • Non-modifying: এটি স্ট্রিমের ডেটা বা তার আচরণ পরিবর্তন করে না। যেহেতু এটি শুধুমাত্র "side effect" তৈরি করে, তাই মূল Observable অপরিবর্তিত থাকে।
  • Debugging: এটি ডিবাগিং বা ডেটার অস্থায়ী পরীক্ষা করার জন্য খুবই উপকারী।

tap() এর সাইনাট

tap(nextFn: (value: T) => void, errorFn?: (error: any) => void, completeFn?: () => void): Observable<T>

এখানে:

  • nextFn: ডেটা প্রতি স্ট্রিমে চলে গেলে এটি কল হবে।
  • errorFn: যদি কোনো ত্রুটি ঘটে, তবে এটি কল হবে।
  • completeFn: যখন স্ট্রিম শেষ হবে, তখন এটি কল হবে।

উদাহরণ: tap() দিয়ে ডেটা লগিং করা

এখানে tap() ব্যবহার করা হয়েছে ডেটার প্রক্রিয়াকরণ বা স্ট্রিমে প্রবাহিত ডেটার উপর কোনো কাজ (যেমন লগিং) করতে।

import { of } from 'rxjs';
import { tap } from 'rxjs/operators';

const observable = of(1, 2, 3);

observable.pipe(
  tap(value => console.log(`Logging value: ${value}`)) // Log each emitted value
).subscribe();

আউটপুট:

Logging value: 1
Logging value: 2
Logging value: 3

এখানে, tap() অপারেটরটি শুধুমাত্র ডেটার প্রতি মানের জন্য লগ তৈরি করছে। মূল Observable (of(1, 2, 3)) অপরিবর্তিত রয়ে গেছে, এবং ডেটা শুধুমাত্র কনসোলে প্রদর্শিত হচ্ছে।


উদাহরণ: tap() দিয়ে ডিবাগিং করা

tap() অপারেটরটি ডিবাগিংয়ের জন্য অত্যন্ত কার্যকরী হতে পারে। এটি ডেটার প্রতি স্ট্রিমে কি ঘটছে তা দেখার জন্য সাহায্য করতে পারে।

import { of } from 'rxjs';
import { tap } from 'rxjs/operators';

const observable = of(5, 10, 15);

observable.pipe(
  tap(value => {
    if (value > 10) {
      console.log(`Value is greater than 10: ${value}`);
    }
  })
).subscribe(value => console.log(`Received value: ${value}`));

আউটপুট:

Received value: 5
Received value: 10
Value is greater than 10: 15
Received value: 15

এখানে, tap() অপারেটরটি প্রতিটি মানের জন্য একটি শর্ত পরীক্ষা করছে (যেমন মানটি ১০ এর বেশি কিনা) এবং সেই অনুযায়ী একটি সাইড-ইফেক্ট তৈরি করছে (কনসোলে একটি বার্তা প্রিন্ট করছে)।


উদাহরণ: tap() দিয়ে স্টেট ম্যানেজমেন্ট বা লগিং

কখনও কখনও, আপনি ডেটা স্ট্রিমের সাথে সাথে কিছু লোকাল স্টেট আপডেট করতে চান, যেমন ডেটা রেকর্ড করা বা ট্র্যাকিং। tap() এই কাজের জন্য উপযুক্ত।

import { of } from 'rxjs';
import { tap } from 'rxjs/operators';

let localState = 0;

const observable = of(1, 2, 3, 4);

observable.pipe(
  tap(value => {
    localState += value;  // Update local state on each value
    console.log(`Current state: ${localState}`);
  })
).subscribe();

আউটপুট:

Current state: 1
Current state: 3
Current state: 6
Current state: 10

এখানে, tap() ব্যবহার করে আমরা প্রতি স্ট্রিমের মানের উপর ভিত্তি করে একটি লোকাল স্টেট আপডেট করছি এবং তা কনসোলে লগ করছি। এইভাবে, স্ট্রিমের ওপর কোনো পরিবর্তন না এনে সাইড-ইফেক্ট তৈরি করা যায়।


tap() এবং Error Handling

tap() অপারেটরটি error handling এর সময়ও ব্যবহার করা যেতে পারে। যখন কোন Observable ত্রুটি ঘটায়, তখন আপনি tap() দিয়ে ত্রুটির তথ্য লগ করতে পারেন বা অন্য কোনো সাইড-ইফেক্ট তৈরি করতে পারেন।

import { throwError } from 'rxjs';
import { tap, catchError } from 'rxjs/operators';

const observable = throwError('An error occurred');

observable.pipe(
  tap({
    error: (err) => console.log(`Error occurred: ${err}`),
  }),
  catchError(err => {
    console.log('Caught error and recovering...');
    return throwError(() => new Error('Handling the error'));
  })
).subscribe({
  next: value => console.log(value),
  error: err => console.log(`Final Error: ${err.message}`),
});

আউটপুট:

Error occurred: An error occurred
Caught error and recovering...
Final Error: Handling the error

এখানে, tap() ত্রুটির প্রেক্ষিতে কনসোলে লগ তৈরি করেছে, এবং catchError() ত্রুটি হ্যান্ডল করেছে।


সারাংশ

  • tap() অপারেটরটি side-effects তৈরি করতে ব্যবহৃত হয়, যেমন লগিং, ডিবাগিং, বা লোকাল স্টেট আপডেট করা। এটি Observable এর ডেটাকে পরিবর্তন করে না, তবে এটি ডেটার প্রতি কিছু কার্যক্রম পরিচালনা করতে সাহায্য করে।
  • এটি non-modifying, অর্থাৎ মূল স্ট্রিমে কোনো পরিবর্তন আনে না।
  • tap() মূলত debugging, logging, state management, বা error logging এর জন্য ব্যবহৃত হয়।

RxJS-এ tap() অপারেটরটি খুবই উপকারী যখন আপনি স্ট্রিমের মান বা প্রক্রিয়াকরণ পর্যবেক্ষণ করতে চান এবং এর উপর কোনো পরিবর্তন ছাড়া কিছু কাজ করতে চান।

Content added By
Promotion

Are you sure to start over?

Loading...