Отказ от ответственности: я являюсь одним из авторов redux-observable, поэтому мне сложно быть на 100% беспристрастным.
В настоящее время мы не приводим никаких причин, по которым redux-observable лучше, чем redux-saga, потому что ... это не так. ????
tl; dr у обоих есть плюсы и минусы. Многие найдут один более интуитивно понятным, чем другой, но оба сложны для изучения по-разному, если вы не знаете RxJS (redux-observable) или генераторы / «эффекты как данные» (redux-saga).
Они решают одну и ту же проблему очень похожими способами, но имеют некоторые фундаментальные различия, которые становятся по-настоящему очевидными только после того, как вы их достаточно используете.
redux-observable почти все передает идиоматическому RxJS. Так что, если у вас есть знания RxJS (или вы их приобрели), изучение и использование redux-observable - это супер-суперестественно. Это также означает, что эти знания могут быть перенесены на другие вещи, кроме редукции. Если вы решите переключиться на MobX, если вы решите переключиться на Angular2, если вы решите переключиться на некоторую будущую популярность X, очень велики шансы, что RxJS может вам помочь. Это потому, что RxJS является универсальной асинхронной библиотекой и во многом похож на язык программирования сам по себе - вся парадигма «реактивного программирования». RxJS существовал с 2012 года и начинался как порт Rx.NET («порты» есть почти во всех основных языках, это очень полезно).
redux-saga сама предоставляет свои основанные на времени операторы, поэтому, хотя знания, которые вы приобретаете о генераторах и обработке побочных эффектов в этом стиле диспетчера процессов, можно передавать, фактические операторы и их использование не используются ни в одной другой крупной библиотеке. Так что это немного прискорбно, но само по себе не должно быть препятствием.
Он также использует «эффекты как данные» (описанные здесь), которые могут поначалу будет сложно осмыслить, но это означает, что ваш код redux-saga на самом деле не вызывает побочных эффектов сам. Вместо этого вспомогательные функции, которые вы используете, создают объекты, похожие на задачи, которые представляют намерение вызвать побочный эффект, а затем внутренняя библиотека выполняет это за вас. Это делает тестирование чрезвычайно простым, без насмешек и очень привлекательным для некоторых людей. Однако я лично обнаружил, что это означает, что ваши модульные тесты переопределяют большую часть логики вашей саги, что делает эти тесты не очень полезными IMO (это мнение разделяют не все)
Люди часто спрашивают, почему мы не делаем что-то подобное с помощью redux-observable: для меня это принципиально несовместимо с обычным идиоматическим Rx. В Rx мы используем такие операторы, как .debounceTime()
, которые инкапсулируют логику, необходимую для устранения дребезга, но это означает, что если бы мы хотели создать его версию, которая фактически не выполняет устранение дребезга, а вместо этого испускает объекты задачи с намерением, вы теперь потеряли мощь Rx, потому что вы больше не можете просто связывать операторы, потому что они будут работать с этим объектом задачи, а не с реальным результатом операции. Это действительно сложно объяснить элегантно. Это снова требует глубокого понимания Rx, чтобы понять несовместимость подходов. Если вы действительно хотите что-то подобное, посмотрите redux-cycle, который использует 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.
person
jayphelps
schedule
13.10.2016