Перейти к содержимому

О курсе RxJS

🌊 RxJS — Реактивное программирование на практике

Заголовок раздела «🌊 RxJS — Реактивное программирование на практике»

Привет, Яша! 👋 Сегодня мы начинаем изучать одну из самых мощных библиотек в мире JavaScript — RxJS. Это немного другой способ думать о коде, но как только ты его поймёшь — всё станет на свои места 🧩


RxJS (Reactive Extensions for JavaScript) — это библиотека для работы с асинхронными потоками данных и событиями.

Представь себе реку 🏞️. Данные — это вода, которая постоянно течёт. Ты можешь:

  • наблюдать за водой (subscribe)
  • фильтровать её (filter)
  • трансформировать (map)
  • комбинировать несколько рек в одну (merge, combineLatest)

Это и есть реактивное программирование!

// Без RxJS — колбэки и промисы
button.addEventListener('click', () => {
fetch('/api/data')
.then(res => res.json())
.then(data => render(data))
.catch(err => handleError(err));
});
// С RxJS — потоки данных
fromEvent(button, 'click').pipe(
switchMap(() => from(fetch('/api/data').then(r => r.json()))),
catchError(err => of({ error: err }))
).subscribe(data => render(data));

  1. Callback Hell — вложенные колбэки как матрёшка 🪆
  2. Управление состоянием — сложно отменить запросы, debounce, throttle
  3. Комбинирование событий — что если нам нужно подождать два API одновременно?
// Поиск с debounce — без RxJS это ~20 строк кода
// С RxJS — 5 строк!
fromEvent(searchInput, 'input').pipe(
debounceTime(300), // ждём паузу 300мс
map(e => e.target.value), // берём значение
distinctUntilChanged(), // пропускаем если не изменилось
switchMap(query => searchApi(query)) // отменяем старый запрос
).subscribe(results => showResults(results));

Реактивное программирование — это парадигма 🧠

Заголовок раздела «Реактивное программирование — это парадигма 🧠»

Существуют разные парадигмы программирования:

ПарадигмаОписаниеПример
ИмперативнаяГоворишь компьютеру КАК делатьfor циклы, if условия
ДекларативнаяГоворишь ЧТО хочешь получитьSQL, React JSX
ФункциональнаяЦепочки чистых функций.map().filter().reduce()
РеактивнаяРеагируешь на изменения данныхRxJS, потоки событий

RxJS — это функционально-реактивное программирование. Сочетание лучшего из двух миров!


// CALLBACKS — старый способ
getData(function(err, data) {
if (err) handleError(err);
else processData(data, function(err2, result) {
// ещё глубже... и глубже... 😵
});
});
// PROMISES — лучше, но всё ещё ограничено
getData()
.then(data => processData(data))
.then(result => render(result))
.catch(handleError);
// ⚠️ Promise — одно значение, нельзя отменить
// RxJS OBSERVABLE — поток значений!
getData().pipe(
switchMap(data => processData(data))
).subscribe({
next: result => render(result),
error: handleError,
complete: () => console.log('Готово!')
});
// ✅ Много значений, можно отменить, мощные операторы
ХарактеристикаCallbackPromiseObservable
Количество значенийОдноОдноМного ♾️
Отмена❌ Сложно❌ Нельзяunsubscribe()
Ленивость❌ Сразу❌ СразуЛенивый
Операторы❌ НетНемного100+
Обработка ошибокСложно.catch()catchError()
СинхронностьОбаТолько asyncОба

Вот что мы изучим в этом курсе:

#ТемаЧто узнаем
1📦 ObservablesОснова всего. Что такое Observable, как создавать
2👁️ Observers & SubscriptionsКак подписываться и отписываться
3📡 SubjectsГорячие потоки, BehaviorSubject, ReplaySubject
4🔧 Операторы: Введениеpipe(), трансформация, фильтрация
5🗺️ Операторы: Трансформацияmap, switchMap, mergeMap, concatMap
6🔍 Операторы: Фильтрацияfilter, take, debounceTime, distinctUntilChanged
7🔗 Операторы: КомбинированиеcombineLatest, forkJoin, merge, zip
8🛡️ Обработка ошибокcatchError, retry, throwError
9🏗️ RxJS в ReactХуки + RxJS, подписки в компонентах
10🚀 Реальные паттерныПоиск, корзина, WebSocket

Думай об Observable как о Netflix:

  • 🎬 Observable = стриминговый сервис (источник данных)
  • 👀 Subscribe = нажать “Смотреть” (начать получать данные)
  • ⏸️ Unsubscribe = нажать “Стоп” (перестать получать)
  • 🎛️ Operators = пульт управления (перемотка, субтитры, качество)
  • 📺 Observer = ты сам (получаешь и обрабатываешь данные)

Пока ты не нажал “Смотреть” — ничего не происходит. Observable ленивый! 😴


Окно терминала
npm install rxjs
# Или в уже существующем проекте
npm install rxjs
// Импорт — берём только то что нужно (tree-shaking!)
import { Observable, Subject, BehaviorSubject } from 'rxjs';
import { map, filter, debounceTime, switchMap } from 'rxjs/operators';
import { of, from, interval, fromEvent } from 'rxjs';

import { of } from 'rxjs';
import { map, filter } from 'rxjs/operators';
// Создаём поток из массива чисел
const numbers$ = of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Знак $ в конце — соглашение для Observable переменных
numbers$.pipe(
filter(n => n % 2 === 0), // только чётные
map(n => n * n) // возводим в квадрат
).subscribe(n => console.log(n));
// Вывод: 4, 16, 36, 64, 100

Видишь как это читается? “Из чисел 1-10, возьми чётные и возведи в квадрат”. Почти как человеческий язык! 🗣️


В следующем уроке мы погрузимся в Observables — самую важную концепцию RxJS. Поехали! →