Reactive Programming with RxJS
Tags: javascript, webdev, tutorial, react
Published: 2023-12-26 11:56:48

**<u>Reactive programming</u>** is a paradigm that deals with asynchronous data flows, where the data is transformed and manipulated by applying various operators. 

> RxJS is a library that implements reactive programming in JavaScript, providing a rich set of operators and utilities to work with observables, which are streams of data that can be subscribed to and reacted to.

One of the main benefits of reactive programming is that it allows us to write cleaner, more maintainable, and robust code, especially when dealing with complex logic, concurrency, and error handling. Reactive programming also enables us to create declarative UIs that react to changes in data and user interactions.

To illustrate reactive programming with examples from RxJS, let's look at some common scenarios:

- **Fetching data from an API**: Suppose we want to fetch some data from an API endpoint using RxJS. We can use the `from` operator to create an observable from a function that returns a promise. The promise will resolve with the data when it is available. Then we can use the `map` operator to transform the data into a desired format. For example:

```javascript
import { from } from 'rxjs';
import { map } from 'rxjs/operators';

// Define a function that returns a promise
function fetchData(url) {
  return fetch(url)
    .then(response => response.json())
    .catch(error => console.error(error));
}

// Create an observable from the function
const fetchDataObservable = from(fetchData);

// Map the data into an array of objects
const dataArray = fetchDataObservable.pipe(
  map(data => {
    // Do some transformation here
    return {
      id: data.id,
      name: data.name,
      price: data.price
    };
  })
);

// Subscribe to the observable and log the array
dataArray.subscribe(array => console.log(array));
```

- **Filtering and sorting data**: Suppose we want to filter and sort some data based on some criteria using RxJS. We can use the `filter` operator to apply a predicate function that returns true or false for each element in the stream. The predicate will determine which elements are emitted by the stream. Then we can use the `sorted` operator to sort the elements based on one or more keys. For example:

```javascript
import { filter, sorted } from 'rxjs/operators';

// Define some sample data
const sampleData = [
  { id: 1, name: 'Alice', price: 10 },
  { id: 2, name: 'Bob', price: 20 },
  { id: 3, name: 'Charlie', price: 30 },
];

// Filter out elements with price less than or equal to 15
const filteredData = sampleData.pipe(
  filter(data => data.price > 15)
);

// Sort elements by name in ascending order
const sortedData = filteredData.pipe(
  sorted('name')
);

// Subscribe to the observable and log the arrays
sortedData.subscribe(array => console.log(array));
```

- **Combining multiple streams**: Suppose we want to combine multiple streams of data into one stream using RxJS. We can use various operators such as `merge`, `concat`, `zip`, or `combineLatest` depending on our needs. For example:

```javascript
import { merge } from 'rxjs';

// Define two sample streams of numbers
const stream1 = new Observable<number>(observer => {
  setTimeout(() => observer.next(1), 1000);
});

const stream2 = new Observable<number>(observer => {
  setTimeout(() => observer.next(2), 2000);
});

// Merge both streams into one stream
const mergedStream = merge(stream1, stream2);

// Subscribe to the observable and log each number emitted by both streams
mergedStream.subscribe(number => console.log(number));
```

These are just some examples of how reactive programming with RxJS can help us write better code for various scenarios. If you want to learn more about reactive programming with RxJS, you can check out the official documentation => [RxJs](https://rxjs.dev/)