bindCallback

Реактивное программирование - это круто.

Становится все более очевидным, что будущее за сетью, а будущее Интернета - за реактивным. Это означает, что сейчас самое время изучить эти концепции.

Чтобы лучше понять реактивное программирование (в частности, ReactiveX / RxJS), я решил учиться на практике. В этой серии, состоящей из нескольких частей, я буду создавать по одному примеру в день, иллюстрирующему использование функции² из RxJS API.

Каждый пример будет самым простым, что я могу придумать, чтобы проиллюстрировать назначение функции. Это не глубокое погружение во внутреннюю работу библиотеки, поэтому пояснения будут настолько подробными, насколько это необходимо для объяснения кода. Если вы вообще не знакомы с ReactiveX, я бы посоветовал сначала прочитать его. Я предполагаю некоторый опыт использования Observable.

BindCallback

Дайте ему функцию f типа f(x, callback), и она вернет функцию g, которая при вызове как g(x) выдаст Observable.

Первая функция в списке API может немного сбить с толку, если вы раньше не видели ничего подобного. bindCallback - одна из нескольких функций, используемых для создания нового Observable. Если вы знакомы с JavaScript, «обратный вызов» должен показаться вполне нормальным, и мы собираемся создать Observable из функции, которая принимает обратный вызов.

Вот веб-пример типичного использования обратного вызова:

Каждый раз, когда документ получает событие click, будет вызываться функция onClick, и мы выходим из системы координат x, y щелчка.

Мы можем преобразовать эту функцию, которая принимает обратный вызов, в функцию, которая возвращает anObservable, используя bindCallback:

Вуаля! Теперь, когда мы щелкаем документ, наш Observable генерирует событие щелчка, а наш onClick обработчик выводит 123 456 (YMMV).

Но подождите, возможно, вы заметили, что событие срабатывает только один раз. Если вы щелкните несколько раз, в консоль будет записано только первое событие. Это связано с тем, что Observable, который создает bindCallback, завершается после того, как испускается первое событие. К счастью, RxJS предоставляет функцию fromEvent, которая создает Observable, который генерирует каждое событие, а не только одно.

В подобном надуманном примере может показаться, что полезность bindCallback ограничена. Но если вы обнаружите, что используете более старую кодовую базу, заваленную асинхронными функциями обратного вызова, и находитесь в процессе рефакторинга, чтобы стать более «реактивным», это может спасти вам жизнь.

Спасибо за чтение, следите за обновлениями Часть 2.

¹ Моя цель - 1 раз в день, но посмотрим.

² На момент написания docs RxJS позволяют фильтровать по функциям и автоматически сортировать по алфавиту. Я буду начинать с вершины этого списка и постепенно спускаться вниз.

ReactiveX и логотип ReactiveX принадлежат http://reactivex.io/.