Jump to content

РеактивныйX

РеактивныйX
Другие имена Реактивные расширения
Оригинальный автор(ы) Майкрософт
Разработчик(и) Участники ReactiveX
Первоначальный выпуск 21 июня 2011 г .; 13 лет назад ( 21.06.2011 )
Репозиторий github /РеактивныйX
Написано в 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 .

См. также

[ редактировать ]
  1. ^ «РеактивИкс» . reactivex.io . Проверено 20 февраля 2020 г.
  2. ^ Перейти обратно: а б «ReactiveX — Введение» . ReactiveX.io . Проверено 23 сентября 2018 г.
  3. ^ «ReactiveX — Операторы» . ReactiveX.io . Проверено 23 сентября 2018 г.
[ редактировать ]
  • ReactiveX , веб-сайт реактивных расширений с документацией и списком реализации.
  • ReactiveX на GitHub
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 09cb79f58f0eb13d814510a947d9b0f5__1713720720
URL1:https://arc.ask3.ru/arc/aa/09/f5/09cb79f58f0eb13d814510a947d9b0f5.html
Заголовок, (Title) документа по адресу, URL1:
ReactiveX - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)