tl; dr
RxJS обрабатывает значения, как только они поступают.Это система push .
IxJS указывает, когда передавать следующее значение.Это система pull .
Пояснение
IxJS
может быть полезно, если вы хотите использовать модель на основе тяги, например, при работе с противодавлением.
Как видно из документации:
IxJS объединяет как синхронные, так и асинхронные коллекции на основе извлечения, так же как RxJS объединил мир коллекций на основе push.RxJS отлично подходит для рабочих процессов, основанных на событиях, где данные могут передаваться со скоростью производителя, однако IxJS отлично подходит для операций ввода-вывода, когда вы, как потребитель, можете извлекать данные, когда будете готовы.
Другими словами:
- Используйте
RxJS
, если ваш производитель (обычно пользователь) медленнее, чем обработка данных (это характерно для внешнего интерфейса). - Использование
IxJS
если ваш производитель (обычно System) работает намного быстрее, чем вы можете обрабатывать данные (более распространено для бэкэнда).
Чтобы понять, что это значит, рассмотрим следующий пример:
Вам необходимо построить конвейер ETL и обработать большой файл (около 1 ТБ).
Если вы напишите его с помощью RxJS, что-то вроде:
readFileByLineObservable('path/to/file')
.pipe(
doSomeHeavyTransformation(),
)
.subscribe()
Затем readFileByLineObservable
постарается как можно быстрее «протолкнуть» весь файл объемом 1 ТБ в оперативную память.Только после этого вы начнете делать doSomeHeavyTransformation
.Эта проблема называется противодавление .
Напротив, IxJS
будет пытаться «вытянуть» каждую новую строку только после обработки предыдущей строки.В этом случае это оптимальный метод обработки.
Разница в том, как .subscribe
RxJS устанавливает слушателя, тогда как .forEach
IxJS сообщает своему итератору, когда нужно дать следующее значение (только после того, как выполнено первоеОн похож, но не совпадает с операторами RxJS concatMap
и concatAll
.