Реактивное программирование в JavaScript (Node.js): библиотека RxJS

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Реактивное программирование в JavaScript (Node.js) с помощью RxJS

Реактивное программирование — это парадигма, ориентированная на асинхронные потоки данных и распространение изменений. В экосистеме JavaScript (Node.js) одной из самых мощных библиотек для реализации этой парадигмы является RxJS (Reactive Extensions for JavaScript). Она предоставляет инструменты для работы с Observable (наблюдаемыми последовательностями), позволяя разработчикам эффективно обрабатывать события, HTTP-запросы, таймеры и другие асинхронные источники данных.

Основные концепции RxJS

В основе RxJS лежат три ключевых компонента:

  • Observable (Наблюдаемый объект) — представляет собой поток данных, который может генерировать значения с течением времени.
  • Observer (Наблюдатель) — объект, который подписывается на Observable и реагирует на поступление новых данных (next), ошибки (error) или завершение потока (complete).
  • Subscription (Подписка) — результат вызова метода subscribe(). Позволяет управлять жизненным циклом подписки (например, отменять её).

Также важную роль играют операторы — чистые функции, которые позволяют трансформировать, фильтровать, объединять и комбинировать потоки данных.

Установка и настройка

Для использования RxJS в проекте Node.js достаточно установить пакет через npm:

npm install rxjs

После установки библиотека готова к работе. Импортируйте необходимые компоненты:

const { Observable, of, from, interval } = require('rxjs');
const { map, filter, take } = require('rxjs/operators');

Создание Observable

Существует несколько способов создания потоков данных. Рассмотрим базовые:

1. Создание из массива

const { from } = require('rxjs');

const numbers$ = from([1, 2, 3, 4, 5]);
numbers$.subscribe({
    next: value => console.log(`Получено: ${value}`),
    complete: () => console.log('Поток завершён')
});

Результат выполнения:

Получено: 1
Получено: 2
Получено: 3
Получено: 4
Получено: 5
Поток завершён

2. Периодическая генерация значений

const { interval } = require('rxjs');
const { take } = require('rxjs/operators');

const timer$ = interval(1000).pipe(
    take(4) // ограничиваем 4 значениями
);

timer$.subscribe({
    next: value => console.log(`Тик ${value}`),
    complete: () => console.log('Таймер завершён')
});

Вывод (с интервалом в 1 секунду):

Тик 0
Тик 1
Тик 2
Тик 3
Таймер завершён

Работа с операторами

Операторы — это сердце RxJS. Они позволяют преобразовывать данные на лету. Рассмотрим два популярных оператора:

  • map — преобразует каждое значение потока.
  • filter — пропускает только те значения, которые удовлетворяют условию.
const { of } = require('rxjs');
const { map, filter } = require('rxjs/operators');

const source$ = of(1, 2, 3, 4, 5, 6);

source$.pipe(
    filter(value => value % 2 === 0), // оставляем только чётные
    map(value => value * 10)          // умножаем каждое на 10
).subscribe({
    next: value => console.log(`Результат: ${value}`),
    complete: () => console.log('Готово')
});

Результат:

Результат: 20
Результат: 40
Результат: 60
Готово

Обработка ошибок в реактивных потоках

RxJS предоставляет встроенные механизмы для обработки ошибок. Например, оператор catchError позволяет перехватить исключение и продолжить выполнение:

const { throwError, of } = require('rxjs');
const { catchError } = require('rxjs/operators');

const error$ = throwError(() => new Error('Что-то пошло не так'));

error$.pipe(
    catchError(err => {
        console.error('Ошибка перехвачена:', err.message);
        return of('Восстановление после ошибки');
    })
).subscribe({
    next: value => console.log(value),
    complete: () => console.log('Поток завершён')
});

Вывод:

Ошибка перехвачена: Что-то пошло не так
Восстановление после ошибки
Поток завершён
                
    
    

Рекомендаций