Observable под капотом
Библиотека Reactive Extensions - реализует механизм асинхронного распространения событий, который используется в Angular для обнаружения изменений и распространения событий (система по отправке и получении уведомлений).
Домашняя страница проекта Reactive Extensions
Как работает: объект observer
собирает события и распространяет их среди подписчиков через Observable
. Для управления потоком событий
к подписчику используются специальные операторы.
В Angular Reactive Extensions необходима для следующий функций Angular: обновление потомков, получение информации о потомках, выдача асинхронных запросов HTTP.
Зачем использовать Reactive Extensions
- Единный интерфейс для любых источников данных
- Возможность объединять источники или подключать их по очереди
- 120+ операторов
- Отмена подписки, когда данные больше не нужны
- Lazy - не будет работать пока нет subscribe
Какие задачи легко решать с RxJs
RxJs работает с любыми источниками данных: события, запросы, клики, массивы, интервалы, 'live search' и т.д.
Drag & Drop - пример на CodePen
- Объединение несколько событий вместе
- Фильтрация события (
delay
,debounce
,throttle
) - Управление асинхронными действиями
- Когда нужна отмена запросов
Операторы RxJS
Позволяют создавать Observable:
from()
- создает Observable, принимает любые данныеfromEvent()
- создает Observable из eventfromPromise()
- создает Observable из Promise
scan()
- позволяет накапливать данныеdelay()
- позволяет откладывать emitdebounceTime()
- предотвращает прокидывание значения, если оно приходит, например, чаще чем 200ms: debounceTime(200)map
- функция вызывается для каждого события, сгенерированного Observable, и возвращает Observable, который emit результат применения функции (map)filter()
- функция вызывается для каждого события, сгенерированного Observable, и отбрасывает те из них, для которых функция возвращает falsetake()
- позволяет взять только несколько значенийmergeMap()
- оставляет в силе предыдущий ObservableswitchMap()
- делает complete для предыдущего ObservabledistinctUntilChanged
- метод подавляет события до изменения объекта событияskipWhile
- метод отбрасывает события испускаемые Observable до тех пор пока не выполнится условие (skipwhile)takeWhile
- передает события подписчику до тех пор пока условие не станет ложнымmerge
- берет один Observable и замешивает в него значение из другого Observablepluck
- передаем имя поля, которое мы хотим получить
Marbles диаграммы
Marbles диаграммы
Observable
Класс Observable
(наблюдаемый объект) - предоставляет последовательность наблюдаемых программой событий/источник событий. Мы можем подписаться на Observable
и получать уведомления при каждом наступлении события.
Метод subscribe
Метод subscribe
в качестве аргументов получает 3 функции:
next
- функция вызывается при инициализации нового событияerror
- функция вызывается при инициализации ошибкиcomplete
- функция вызывается при завершении последовательности событий
А как же Promise
Объекты Observable
обладают большей гибкостью и большей функциональность, но все же
библиотека Reactive Extensions предоставляет метод
Observable.fromPromise - создает Observable, который использует Promise
как источник событий.
Также есть метод Observable.toPromise - для того чтобы Observable
превратить в Promise
.
Observer
Observer
(наблюдатель) - механизм создания обновлений.
Методы Observer
next(data)
- создает новое событие с использованием нового значения (data
)error(errObj)
- сигнализирует об ошибкеcomplete()
- сигнализирует об окончании последовательности событий
Объекты типа Subject
Библиотека Reactive Extensions предоставляет класс Subject
, реализующий функциональность как Observable
так и Observer
. Следовательно можно создавать службы,
которые и генерируют и потребляют события в одном объекте.
Subject - очень важно изучить, так как позволяют легко организовать взаимодействие между компонентами: Общение между компонентами через Observable и Subject, Angular (оригинал)
Более подробно на сайте dnzl.ru: Observable под капотом
Комментарии к статье