Запрос четкого, живописного объяснения Reactive Extensions (RX)? - программирование
Подтвердить что ты не робот

Запрос четкого, живописного объяснения Reactive Extensions (RX)?

В течение долгого времени я пытаюсь обернуть голову вокруг RX. И, вернее, я никогда не сомневаюсь, получил ли я это или нет.

Сегодня я нашел объяснение http://reactive-extensions.github.com/RxJS/, которое, на мой взгляд, ужасно. В нем говорится:

RxJS - это события как promises для async.

Великий. Это предложение настолько сложное, что, если у вас нет ни малейшего представления о том, что такое RX, после этого предложения вы так же тупы, как раньше.

И это в основном моя проблема: все объяснения в обычных местах, которые вы обнаружите в RX, (по крайней мере, я), кажутся немыми. Они объясняют RX как сложную концепцию с множеством очень сложных слов и терминов и вообще, и я никогда не уверен, что это такое.

Итак, мой вопрос: как бы вы объяснили RX тому, кому исполнилось пять лет? Я хотел бы дать четкое, живописное объяснение того, что это такое, для чего он хорош, и каковы его основные понятия?

4b9b3361

Ответ 1

Итак, LINQ (в JavaScript это высокоуровневые методы массива, такие как map, filter, reduce и т.д.), если вы не С# dev, просто замените это, когда я упоминаю 'LINQ' ) дает вам набор инструментов, которые вы можете применить к последовательностям ( "Списки" в грубом смысле), чтобы фильтровать и преобразовывать входные данные в вывод (aka "Список, который мне действительно интересен" ). Но что такое список?

Что такое список?

Список, это некоторые элементы, в конкретном порядке. Я могу взять любой список и преобразовать его в лучший список с LINQ.

(Не обязательно отсортированный порядок, но порядок).

Событие представляет собой список

Но как насчет события? Подписываться на событие:

OnKeyUp += (o,e) => Console.WriteLine(e.Key)
>>> 'H'
>>> 'e'
>>> 'l'
>>> 'l'
>>> 'o'

Hm. Это выглядит как некоторые вещи, в конкретном порядке. Теперь это внезапно озаряет вас, список, и одно и то же событие!

Если списки и события одинаковы....

... то почему я не могу преобразовать и фильтровать входные события в более интересные события. То, что Rx. Он берет все, что вы знаете о работе с последовательностями, включая все операторы LINQ, такие как Select и Where and Aggregate, и применяет их к событиям.

Легкий peasy.

Обратный вызов - это также последовательность

Не является ли обратный звонок только в основном событием, которое происходит только один раз? Разве это не просто как список с одним элементом? Оказывается, и одна из интересных вещей о Rx заключается в том, что она позволяет нам рассматривать события и обратные вызовы (и такие вещи, как запросы геолокации) с одним и тем же языком (т.е. Мы можем комбинировать эти два или ждать эфира один или другой, и т.д.).

Ответ 2

Наряду с отличным ответом Павла я хотел бы добавить концепцию pulling vs pushing data.

Трубопроводный

Давайте рассмотрим пример кода, который генерирует ряд чисел и выводит результат. Если вы думаете об этом как о потоке на одном конце, у вас есть producer, который создает для вас новые числа, а с другой стороны вы имеете consumer, который делает что-то с этими числами.

Список Pull - Primes

Допустим, что producer создает список простых чисел. Обычно у вас будет какая-то функция, которая дает список чисел, и каждый раз, когда она вернется, она будет выталкивать следующее значение, которое оно вычисляло через трубу, в consumer, которое выводило бы это число на экран.

Prime Generator --- > Console.WriteLine

В этом случае легко видеть, что producer выполняет большую часть работы, а consumer будет сидеть, ожидая, когда producer отправит следующее значение. consumer тянет на конвейер, ожидая, пока producer вернет следующее значение.

Push - Прогресс процентов событий от быстрого процесса (Реактивный)

Хорошо, скажем, у вас есть функция, которая обрабатывает 1 000 000 элементов. Каждый элемент занимает миллисекунды для обработки, а затем функция дает процентное значение того, как далеко оно получилось. Так много значений прогресса, очень быстро.

На другом конце трубопровода имеется индикатор выполнения. Теперь, если индикатор выполнения должен обрабатывать каждое обновление, пользовательский интерфейс блокирует попытку идти в ногу с потоком значений.

1-Million-Items-Processor --- > Панель выполнения

В этом случае данные проталкиваются по конвейеру с помощью producer, а затем блокируется consumer, потому что для его обработки требуется слишком много данных.

Reactive позволяет вводить задержки, окна или пробовать конвейер в зависимости от того, как вы хотите consume данных. В этом случае я собирал данные каждую секунду перед обновлением индикатора выполнения.

Списки против событий

Таким образом, списки и события кажутся одинаковыми. Разница заключается в том, что данные вытаскиваются или проталкиваются через систему. С списками данные вытягиваются. С событиями данные нажимаются.