Я очень хорошо знаком с Rx для JavaScript, так как недавно я активно использовал его на большомпроект, и на самом деле аспекты разработки Knockout сделаны с учетом моего опыта Rx.
Ключевое различие между реализацией шаблона наблюдателя в Knockout и Rx состоит в том, что Knockout автоматически выводит ассоциации и зависимости между наблюдаемыми изобычный процедурный код без необходимости указывать их заранее через специальный функциональный API.Я хотел, чтобы Knockout использовал обычный код процедурного / императивного стиля, так как он более знаком и доступен большинству разработчиков.
Другое отличие состоит в том, что Rx оптимизирован для составления потоков событий без состояния.Сначала я с энтузиазмом относился к этому и к его функциональной чистоте, но через некоторое время мне все больше казалось, что я прыгаю через неуклюжие обручи и мне пришлось придумывать дополнительные способы имитации состояния для эффективного управления командами пользовательского интерфейса.Вот почему в Knockout все наблюдаемые могут быть обработаны как сохраняющие состояние - например, вы всегда можете прочитать их последнее значение (кстати, оно кэшируется - оно не пересчитывается до тех пор, пока не изменятся базовые данные).
Rx идет дальше, чем Knockout, в продвинутые способы составления потоков событий, тогда как Knockout идет дальше, чем Rx, в разработку пользовательского интерфейса, позволяя вам связывать его наблюдаемые с элементами и шаблонами HTML DOM и манипулировать ими любым удобным для вас способом.Rx великолепен в том, что делает, но, как оказалось, не совсем так, как я хотел создавать богатые пользовательские интерфейсы - отсюда и дизайн Knockout.