DEV Community

Robin Rai
Robin Rai

Posted on • Updated on

RxJS Operators: The Secret Weapons of Asynchronous Programming

RxJS (Reactive Extensions for JavaScript) is a powerful library for handling asynchronous and event-driven programming. Here are 10 important operators in RxJS along with code snippets to demonstrate their usage:

1. map() operator - Transforms the values emitted by an Observable.

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

const source = of(1, 2, 3, 4, 5);
const modified = source.pipe(
  map(value => value * 2)
);

modified.subscribe(value => console.log(value)); // Output: 2, 4, 6, 8, 10
Enter fullscreen mode Exit fullscreen mode

2. filter() operator - Filters values emitted by an Observable based on a condition.

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

const source = of(1, 2, 3, 4, 5);
const filtered = source.pipe(
  filter(value => value % 2 === 0)
);

filtered.subscribe(value => console.log(value)); // Output: 2, 4
Enter fullscreen mode Exit fullscreen mode

3. merge() operator - Combines multiple Observables into a single Observable.

import { of, merge } from 'rxjs';

const source1 = of('A', 'B');
const source2 = of('X', 'Y');
const merged = merge(source1, source2);

merged.subscribe(value => console.log(value)); // Output: A, B, X, Y
Enter fullscreen mode Exit fullscreen mode

4. concat() operator - Concatenates multiple Observables in a sequential order.

import { of, concat } from 'rxjs';

const source1 = of('A', 'B');
const source2 = of('X', 'Y');
const concatenated = concat(source1, source2);

concatenated.subscribe(value => console.log(value)); // Output: A, B, X, Y
Enter fullscreen mode Exit fullscreen mode

5. debounceTime() operator - Emits the last value from an Observable only after a specified time has passed.

import { fromEvent } from 'rxjs';
import { debounceTime } from 'rxjs/operators';

const input = document.getElementById('input');
const input$ = fromEvent(input, 'input');
const debouncedInput$ = input$.pipe(
  debounceTime(300)
);

debouncedInput$.subscribe(value => console.log(value.target.value));
Enter fullscreen mode Exit fullscreen mode

6. combineLatest() operator - Combines the latest values from multiple Observables.

import { of, combineLatest } from 'rxjs';

const source1 = of('A', 'B');
const source2 = of('X', 'Y');
const combined = combineLatest(source1, source2);

combined.subscribe(value => console.log(value)); // Output: ['B', 'X'], ['B', 'Y']
Enter fullscreen mode Exit fullscreen mode

7. zip() oprator - Combines corresponding values from multiple Observables into an array.

import { of, zip } from 'rxjs';

const source1 = of('A', 'B');
const source2 = of('X', 'Y');
const zipped = zip(source1, source2);

zipped.subscribe(value => console.log(value)); // Output: ['A', 'X'], ['B', 'Y']
Enter fullscreen mode Exit fullscreen mode

8. take() operator - Emits only the first n values from an Observable.

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

const source = of(1, 2, 3, 4, 5);
const taken = source.pipe(
  take(3)
);

taken.subscribe(value => console.log(value)); // Output: 1, 2, 3
Enter fullscreen mode Exit fullscreen mode

9. retry() operator - Re-subscribes to an Observable a specified number of times on error.

import { interval } from 'rxjs';
import { retry } from 'rxjs/operators';

const source = interval(1000).pipe(
  map(value => {
    if (value === 2) {
      throw new Error('Something went wrong');
    }
    return value;
  })
);

const retried = source.pipe(
  retry(2) // Retry 2 times
);

retried.subscribe(
  value => console.log(value),
  error => console.error(error)
);
Enter fullscreen mode Exit fullscreen mode

10. distinctUntilChanged() operator - Emits only values that are different from the previous value.

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

const source = of(1, 1, 2, 2, 3, 3);
const distinct = source.pipe(
  distinctUntilChanged()
);

distinct.subscribe(value => console.log(value)); // Output: 1, 2, 3
Enter fullscreen mode Exit fullscreen mode

Conclusion:

In this exploration of RxJS operators, we've uncovered the secret weapons of asynchronous programming. From transforming data with map to filtering with filter, and combining Observables with merge and concat, these operators offer you a powerful toolkit for managing complex asynchronous workflows. Remember that mastering RxJS takes practice, so don't be afraid to experiment and build your own data flow pipelines. As you delve deeper into the world of reactive programming, these operators will become your trusted allies. If you found this post insightful, share it with your fellow developers and stay tuned for more in-depth content on RxJS and reactive programming. Happy coding with RxJS!"

Top comments (0)