РеактивныйX
Эта статья нуждается в дополнительных цитатах для проверки . ( март 2017 г. ) |
Другие имена | Реактивные расширения |
---|---|
Оригинальный автор(ы) | Майкрософт |
Разработчик(и) | Участники ReactiveX |
Первоначальный выпуск | 21 июня 2011 г |
Репозиторий | github |
Написано в | Java , Scala , C# , C++ , Clojure , JavaScript , Python , Groovy , JRuby и другие. |
Платформа | Кросс-платформенный |
Тип | API |
Лицензия | Лицензия Апач 2.0 , МОЯ лицензия |
Веб-сайт | реактивекс |
ReactiveX ( Rx , также известный как Reactive Extensions ) — это программная библиотека, первоначально созданная Microsoft , которая позволяет императивным языкам программирования работать с последовательностями данных независимо от того, являются ли данные синхронными или асинхронными . Он предоставляет набор операторов последовательности, которые работают с каждым элементом последовательности. Это реализация реактивного программирования , предоставляющая основу для инструментов, которые будут реализованы на нескольких языках программирования .
Обзор
[ редактировать ]ReactiveX — это API для асинхронного программирования с наблюдаемыми потоками. [1]
Асинхронное программирование позволяет программистам вызывать функции, а затем выполнять «обратный вызов» функций, когда они выполняются, обычно путем присвоения функции адреса другой функции, которая будет выполняться после ее завершения. Программы, разработанные таким образом, часто позволяют избежать накладных расходов, связанных с постоянным запуском и остановкой множества потоков.
Наблюдаемые потоки (то есть потоки, которые можно наблюдать) в контексте реактивных расширений подобны генераторам событий, которые генерируют три события: следующее, ошибка и завершение. Наблюдаемый объект генерирует следующие события до тех пор, пока не выдаст событие ошибки или полное событие. Однако в этот момент он больше не будет генерировать никаких событий, если на него снова не подпишется.
Мотивация
[ редактировать ]Для последовательностей данных он сочетает в себе преимущества итераторов с гибкостью асинхронного программирования на основе событий. Это также работает как простое обещание, устраняя пирамиду обреченности , возникающую в результате множества уровней обратных вызовов.
Наблюдаемые и наблюдатели
[ редактировать ]ReactiveX — это комбинация идей из шаблонов наблюдателя и итератора , а также из функционального программирования . [2]
Наблюдатель подписывается на наблюдаемую последовательность. Затем последовательность отправляет элементы наблюдателю по одному, обычно путем вызова предоставленной функции обратного вызова. Наблюдатель обрабатывает каждый из них перед обработкой следующего. Если много событий поступает асинхронно, их необходимо сохранить в очереди или удалить. В ReactiveX наблюдатель никогда не будет вызываться, если элемент не в порядке, или (в многопоточном контексте) вызываться до того, как обратный вызов вернется для предыдущего элемента. Асинхронные вызовы остаются асинхронными и могут обрабатываться путем возврата наблюдаемого объекта.
Он похож на шаблон итераторов тем, что в случае возникновения фатальной ошибки наблюдатель уведомляется отдельно (путем вызова второй функции). Когда все элементы отправлены, он завершается (и уведомляет наблюдателя, вызывая третью функцию). API Reactive Extensions также заимствует многие из своих операторов у операторов-итераторов в других языках программирования.
Реактивные расширения отличаются от функционального реактивного программирования , как объясняется во Введении в реактивные расширения:
Иногда его называют «функциональным реактивным программированием», но это неправильное название. ReactiveX может быть функциональным и реактивным, но «функциональное реактивное программирование» — это совсем другое дело. Одно из основных отличий заключается в том, что функциональное реактивное программирование оперирует значениями, которые непрерывно изменяются с течением времени, тогда как ReactiveX оперирует дискретными значениями, которые передаются с течением времени. (Более точную информацию о функциональном реактивном программировании см. в работе Конала Эллиотта.) [2]
Реактивные операторы
[ редактировать ]Оператор — это функция, которая принимает одну наблюдаемую (источник) в качестве первого аргумента и возвращает другую наблюдаемую (адресат или внешнюю наблюдаемую). Затем для каждого элемента, который излучает исходный наблюдаемый объект, он применяет функцию к этому элементу, а затем испускает ее в целевом наблюдаемом объекте. Он может даже создать еще один Observable в наблюдаемом объекте назначения. Это называется внутренней наблюдаемой.
За оператором, который выдает внутренние наблюдаемые, может следовать другой оператор, который каким-то образом объединяет элементы, выдаваемые всеми внутренними наблюдаемыми, и выдает элемент на своем внешнем наблюдаемом. Примеры включают в себя:
switchAll
– подписывается на каждую новую внутреннюю наблюдаемую, как только она создается, и отписывается от предыдущей.mergeAll
– подписывается на все внутренние наблюдаемые по мере их генерации и выводит их значения в любом порядке их получения.concatAll
– подписывается на каждую внутреннюю наблюдаемую по порядку и ждет ее завершения, прежде чем подписываться на следующую наблюдаемую.
Операторы могут быть объединены в цепочку для создания сложных потоков данных, которые фильтруют события на основе определенных критериев. К одной и той же наблюдаемой можно применять несколько операторов.
Некоторые операторы, которые можно использовать в реактивных расширениях, могут быть знакомы программистам, использующим функциональный язык программирования, например Map, Reduc, Group и zip. [3] В Reactive Extensions доступно множество других операторов, хотя операторы, доступные в конкретной реализации языка программирования, могут различаться.
Примеры реактивных операторов
[ редактировать ]Вот пример использования операторов карты и сокращения. Мы создаем наблюдаемую из списка чисел. Затем оператор карты умножит каждое число на два и вернет наблюдаемую величину. Затем оператор сокращения суммирует все предоставленные ему числа (значение 0 является отправной точкой). Вызов подписки зарегистрирует наблюдателя , который будет наблюдать за значениями наблюдаемого, созданного цепочкой операторов. С помощью метода subscribe мы можем передать функцию обработки ошибок, вызываемую всякий раз, когда в наблюдаемом объекте возникает ошибка, и функцию завершения, когда наблюдаемый объект завершил отправку элементов.
import { of, Observable, map, reduce } from 'rxjs';
const source: Observable<number> = of(1, 2, 3, 4, 5);
source
.pipe(
map((value) => value * 2),
reduce((sum, value) => sum + value, 0)
)
.subscribe({
next: (value) => {
console.log(value);
},
error: (error) => {
console.error(error);
},
complete: () => {
console.log('done');
},
});
В приведенном выше примере используется реализация реактивных расширений RxJS для языка программирования JavaScript.
История
[ редактировать ]Реактивные расширения (Rx) были созданы командой облачного программирования Microsoft примерно в 2011 году как побочный продукт более крупной разработки под названием Volta . Первоначально он был предназначен для предоставления абстракции событий на разных уровнях приложения для поддержки разделения уровней в Volta. Логотип проекта представляет собой электрического угря, что является отсылкой к Вольте. Суффикс расширений в названии является отсылкой к технологии параллельных расширений, которая была изобретена примерно в то же время; эти два считаются взаимодополняющими.
Первоначальная реализация Rx предназначалась для .NET Framework и была выпущена 21 июня 2011 года. Позже команда приступила к реализации Rx для других платформ, включая JavaScript и C++ . Технология была выпущена с открытым исходным кодом в конце 2012 года, первоначально на CodePlex . Позже код переехал на GitHub .
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «РеактивИкс» . reactivex.io . Проверено 20 февраля 2020 г.
- ^ Перейти обратно: а б «ReactiveX — Введение» . ReactiveX.io . Проверено 23 сентября 2018 г.
- ^ «ReactiveX — Операторы» . ReactiveX.io . Проверено 23 сентября 2018 г.