Отказ от ответственности: я являюсь одним из авторов наблюдаемых по редуксу, поэтому мне трудно быть беспристрастным на 100%.
В настоящее время мы не приводим причин, по которым наблюдаемая редукс лучше, чем сага о редуксе, потому что ... это не так. 😆
TL; DR есть плюсы и минусы для обоих. Многие найдут одно более интуитивно понятным, чем другое, но оба сложны в изучении по-разному, если вы не знаете RxJS (наблюдаемый при редуксе) или генераторы / «эффекты как данные» (избыточная сага).
Они решают одну и ту же проблему чрезвычайно похожими способами, но имеют некоторые фундаментальные различия, которые становятся действительно очевидными только после того, как вы их достаточно используете.
Наблюдаемый за редуксом откладывает почти все до идиоматического RxJS. Таким образом, если у вас есть знания RxJS (или вы получили их), изучение и использование наблюдаемых в редуксе суперъестественно. Это также означает, что эти знания могут быть переданы другим вещам. Если вы решите переключиться на MobX, если вы решите переключиться на Angular2, если вы решите переключиться на какую-то будущую популярность X, очень велики шансы, что RxJS может вам помочь. Это связано с тем, что RxJS - это универсальная асинхронная библиотека, которая во многом похожа на язык программирования сама по себе - целую парадигму «реактивного программирования». RxJS существует с 2012 года и начинался как порт Rx.NET («порты» есть почти на всех основных языках, это очень полезно ).
redux-saga предоставляет свои операторы, основанные на времени, так что, хотя знания, которые вы приобретаете о генераторах и обработке побочных эффектов в этом стиле менеджера процессов, можно передавать, фактические операторы и их использование не используются ни в одной другой основной библиотеке. Так что это немного прискорбно, но, конечно, само по себе не должно нарушать договоренности.
Он также использует «эффекты как данные» ( описанные здесь ), которые поначалу может быть трудно обернуть вокруг, но это означает, что ваш код излишней саги фактически не выполняет сами побочные эффекты. Вместо этого, вспомогательные функции, которые вы используете, создают объекты, которые похожи на задачи, представляющие намерение выполнить побочный эффект, а затем внутренняя библиотека выполняет это за вас. Это делает тестирование чрезвычайно простым, не требующим насмешек и очень привлекательным для некоторых людей. Тем не менее, я лично нашел, что это означает, что ваши юнит-тесты переопределяют большую часть логики вашей саги - делая эти тесты не очень полезными IMO (это мнение разделяют не все)
Люди часто спрашивают, почему мы не делаем что-то подобное с помощью redux-observable: для меня это принципиально несовместимо с обычным идиоматическим Rx. В Rx мы используем такие операторы, .debounceTime()
которые инкапсулируют логику, необходимую для устранения неполадок, но это означает, что если бы мы хотели создать его версию, которая на самом деле не выполняет устранение неполадок и вместо этого генерирует объекты задачи с намерением, вы теперь потеряли мощь Rx, потому что вы больше не можете просто связывать операторы, потому что они будут работать с этим объектом задачи, а не с реальным результатом операции. Это действительно сложно объяснить элегантно. Это снова требует глубокого понимания Rx, чтобы понять несовместимость подходов. Если вам действительно нужно что-то подобное, посмотрите redux-циклыкоторый использует cycle.js и в основном преследует эти цели. Я считаю, что это требует слишком много церемоний, на мой вкус, но я рекомендую вам попробовать, если это вас интересует.
Как упоминал ThorbenA, я не уклоняюсь от признания, что redux-saga в настоящее время (13.10.16) является явным лидером в управлении сложными побочными эффектами для redux. Он был запущен раньше и имеет более сильное сообщество. Так что есть много привлекательности в использовании стандарта де-факто по сравнению с новичком в блоке. Я думаю, можно с уверенностью сказать, что если вы используете любой из них без предварительного знания, вы можете запутаться. Мы оба используем довольно продвинутые концепции, которые, как только вы «поймете», значительно упрощают комплексное управление побочными эффектами, но до тех пор многие спотыкаются.
Самый важный совет, который я могу дать, - не приносить ни одну из этих библиотек до того, как они вам понадобятся. Если вы выполняете только простые вызовы ajax, они, вероятно, вам не нужны. redux-thunk глупо, просто для изучения и предоставляет достаточно для основ - но чем сложнее асинхронный, тем сложнее (или даже невозможно) он становится для redux-thunk. Но для redux-observable / saga во многих отношениях он лучше всего показывает, чем сложнее асинхронный. Также есть много достоинств в использовании redux-thunk с одним из других (redux-observable / saga) в том же проекте! redux-thunk для обычных простых вещей, а затем только с использованием redux-observable / saga для сложных вещей. Это отличный способ оставаться продуктивным, поэтому вы не боретесь с redux-observable / saga из-за вещей, которые были бы тривиальными с помощью redux-thunk.