Стаття народилася з цієї відповіді на StackOverflow і переросла в цей блог пост (англійською), але я думаю вона не втратила актуальність.
Зараз дуже багато галасу навколо Reactive Programming. Я витратив якийсь час на вивчення цієї дисципліни застосовано до JavaScript і Node.js і склав свою думку про самі, на мій погляд, цікаві бібліотеки.
RxJS
Це свого роду еталон - поява Reactive Extensions для .net, в якомусь сенсі, створила цю дисципліну.
Pros:
- Документація і велике ком'юніті (> 15000 зірочок на Github, > 3073 тегів на SO);
- Це бібліотека з сімейства Rx *, а отже використовує той самий інтерфейс. Практично, це означає, що іноді можна дивитися приклади з RxJava і оригінально Reactive Extensions;
- Є примітиви майже на всі випадки життя;
- Є backpressure (ось тут можна прочитати що це);
- по цій бібліотеці є одна книга.
Cons:
- Іноді виглядає як «матан». Документації нагадують безодню - не зрозуміло, як це все «на голову натягнути»?
- Реалізовано хлопцями з Java'ою в голові (любов до великої кількості абстракцій, ідіоматика з Java/.Net, іноді дивні сигнатури). Це не те щоб погано, просто деякі речі виглядають в JS дивними (приклад Scheduler - я так і не зрозумів навіщо це все потрібно в single-thread середовищі). Звідси ж бажання писати на TypeScript'e
Bacon.js
Колись модна бібліотека для хіпстерів - зараз всі забули
Pros
- Гарна документація і хороші приклади від ком'юніті (наприклад, гра Змійка);
- Реалізовано майже всі примітиви з Rx *;
- Реалізовували в першу дуже для JS і JSсним бекграундом;
- ІМХЗ, дуже легко почати просто пройшовшись за прикладами та документацією.
Cons
- Немає Backpressure - давайте просто забудемо про backend розробку
Highland.js
Бібліотека від caolan - автора async
Pros:
- Відразу писалося для JS/Node.js хлопцями які на них писали щось велике і люблять мову/платформу - а значить JS-ная ідіоматика і Node.js в голові (див. наступний пункт);
- Побудовано поверх Node.js Stream, це забезпечило бібліотеці маленький розмір. Крім того, суб'єктивно, так набагато легше про це все думати: у нас є stream A, ми з ним щось робимо і pipe'аєм його в stream B (ось моя стаття, з прикладом);
- backpressure - Причому наскільки я розумію нічого не потрібно було писати руками, все вже є в Node.js Stream.
Cons:
- Слабка документаціяуже краща і відсутня прикладів. За прикладами прийдеться лізти в Rx або Bacon - змиріться з цим;
- Відсутність багатьох примітивів. Не те щоб їх складно реалізувати руками, але все ж. приклад .interval і .combceLatest;
- Дуже суб'єктивно: Флегматичне коммьюніти - самі пишуть, самі кайфують, експансії не ведуть.
Замість підсумку
Через відстутність осудних прикладів вам прийдеться подивитися всі ці бібліотеки, Rx * так точно. ІМХО, найправильніша Highland - люди, які її писали, розуміють ідіоматику платформи і люблять її. Найбільш «зріла» RxJS - її ще в Angular «впиляли», hype-гарантований.
Підказка: Якщо вам потрібно щось запитати на StackOverflow - перекладіть відразу RxJS- «діалект», так з більшою ймовірністю дадуть відповідь.