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/.