Відмова: Я є одним із авторів спостережувальних редукцій, тому мені важко бути 100% неупередженою.
Наразі ми не наводимо жодної причини, яку можна спостерігати за редуксом - це краще, ніж редукс-сага, оскільки ... це не так. 😆
tl; dr є плюси і мінуси для обох. Багато хто знайде один інтуїтивніший, ніж інший, але обидва є складними для вивчення різними способами, якщо ви не знаєте RxJS (можна спостерігати за редукцією) або генераторів / "ефектів як даних" (redux-saga).
Вони вирішують ту саму проблему надзвичайно схожими способами, але мають деякі принципові відмінності, які стають по-справжньому очевидними лише після того, як ви їх досить використаєте.
спостережуваний за редуксом відкладає майже все на ідіоматичний RxJS. Отже, якщо ви володієте знаннями RxJS (або здобуваєте їх), навчання та використання спостережуваних за редуксом надзвичайно природно. Це також означає, що ці знання можуть бути передані іншим, ніж редукція. Якщо ви вирішили перейти на MobX, якщо ви вирішите перейти на Angular2, якщо ви вирішите перейти на якусь майбутню гарячість X, велика ймовірність, що RxJS може вам допомогти. Це тому, що RxJS - це загальна бібліотека асинхронізації, і багато в чому схожа на мову програмування - цілу парадигму "Реактивне програмування". RxJS існує з 2012 року і розпочався як порт Rx.NET (є "порти" майже на всіх основних мовах, це корисно ).
redux-saga надає свої оператори на основі часу, тому хоча знання, які ви отримуєте про генератори та обробку побічних ефектів у цьому стилі керування процесами, можна передати, фактичні оператори та використання не використовуються ні в якій іншій великій бібліотеці. Тож це трохи прикро, але, безумовно, не повинно бути самим собою укладенням угод.
Він також використовує "ефекти як дані" ( описано тут ), що спочатку може бути важко обернути головою, але це означає, що ваш код редук-саги насправді не виконує самих побічних ефектів. Натомість допоміжні функції, які ви використовуєте, створюють об'єкти, подібні до завдань, що представляють собою намір зробити побічний ефект, а потім внутрішня бібліотека виконує це за вас. Це робить тестування надзвичайно простим, без необхідності глузування та дуже привабливим для деяких людей. Однак я особисто виявив, що це означає, що ваші тести повторно реалізують велику частину логіки вашої саги - роблячи ці тести не дуже корисними ІМО (такої думки не всі поділяють)
Люди часто запитують, чому ми не робимо щось подібне зі спостережуваним редуксом: для мене це принципово несумісне з нормальним ідіоматичним Rx. У Rx ми використовуємо такі оператори, .debounceTime()
які інкапсулює логіку, необхідну для дебютації, але це означає, що якщо ми хотіли зробити її версію, яка насправді не виконує розгортання, а замість цього випускає об'єкти завдань з наміром, ви втратили потужність Rx, тому що ви більше не можете просто ланцюжок операторів, тому що вони будуть працювати над цим об'єктом завдання, а не реальним результатом операції. Це справді важко пояснити елегантно. Це знову ж таки вимагає чіткого розуміння Rx, щоб зрозуміти несумісність підходів. Якщо ви дійсно хочете чогось подібного, перегляньте редукційні циклиякий використовує cycl.js і в основному має ці цілі. Я вважаю, що це вимагає занадто великої церемонії для моїх смаків, але я закликаю вас закрутити її, якщо це вас зацікавить.
Як згадував ThorbenA, я не цураюся того, щоб визнати, що редукс-сага в даний час (13.10.16) є чітким лідером у комплексному управлінні побічними ефектами для редукса. Вона була розпочата раніше і має більш міцну спільноту. Тож існує велика привабливість використання стандарту де-факто над новою дитиною на блоці. Я думаю, що це можна сміливо сказати, якщо ви використовуєте будь-який без попереднього знання, ви заплуталися. Ми обидва використовуємо досить прогресивні концепції, які, як тільки ви "отримуєте", значно ускладнюють управління побічними ефектами, але до цього багато спотикаються.
Найважливіша порада, яку я можу дати, - це не приносити жодної з цих бібліотек, перш ніж вони вам знадобляться. Якщо ви робите лише прості дзвінки Ajax, вони, ймовірно, не потребують. redux-thunk дурно простий у навчанні та забезпечує достатню кількість основ - але чим складніша асинхронізація, тим важче (а то й неможливо) це стає для redux-thunk. Але для редукційного / спостережуваного / саги багато в чому це яскраво виглядає найбільш складним є асинхроніка. У цьому ж проекті є багато заслуг у використанні редук-тунк з одним із інших (редукційне спостереження / сага)! redux-thunk для ваших звичайних простих речей, а потім лише з використанням редукційного / спостережуваного / саги для складних матеріалів. Це чудовий спосіб залишатися продуктивними, тому ви не боретесь відслідковуваного / саги за речі, які були б тривіальними за допомогою редук-тунку.