Почему используйте Redux-наблюдаемые за возвращение-Сага?
Я использовал Redux-Saga. Код, написанный с ним, легко рассуждать до сих пор, за исключением того, что функция генератора JS время от времени путается в моей голове. Из моего понимания,Redux-Observable может достичь аналогичной работы, которая обрабатывает побочные эффекты, но без использования функции генератора.
однако документы из Redux-Observable не дают много мнений о том, почему он превосходит Redux-Saga. Я хотел бы знать, не использует ли генератор функция является единственным преимуществом использования Redux-Observable. И каковы могут быть недостатки, gotcha или компромиссы от использования Redux-Observable вместо Redux-Saga? Спасибо заранее.
5 ответов:
отказ от ответственности: я один из авторов redux-observable, поэтому мне трудно быть на 100% беспристрастным.
в настоящее время мы не предоставляем никаких причин redux-observable лучше, чем redux-saga because...it-нет.
tl; dr есть плюсы и минусы для обоих. Многие найдут один более интуитивным, чем другой, но оба они сложны для изучения по-разному, если вы не знаете RxJS (redux-observable) или генераторы/"эффекты как данные" (redux-saga).
они решают одна и та же проблема чрезвычайно схожа, но имеет некоторые фундаментальные различия, которые становятся по-настоящему очевидными только после их достаточного использования.
redux-observable переносит почти все на идиоматический RxJS. Поэтому, если у вас есть знания RxJS (или получить его), обучение и использование redux-observable супер супер естественно. Это также означает, что это знание может быть передано другим вещам, кроме redux. Если вы решите переключиться на MobX, если вы решите переключиться на Angular2, если вы решите переключиться на некоторые будущие горячие X, шансы очень хороши, что RxJS может помочь вам. Это связано с тем, что RxJS является универсальной асинхронной библиотекой и во многом похож на язык программирования сам по себе-вся парадигма "реактивного программирования". RxJS существовал с 2012 года и начинался как порт Rx.NET (есть "порты" почти во всех основных языках, это что полезно).
redux-saga предоставляет свои операторы на основе времени сам, так что в то время как знания, которые вы приобретаете о генераторах и обработка побочных эффектов в этом стиле process-manager является переносимой, фактические операторы и использование не используются ни в одной другой крупной библиотеке. Так что это немного прискорбно, но, конечно, не критично само по себе.
Он также использует "эффекты, как данные" (описано здесь), что может быть трудно обернуть вашу голову вокруг сначала, но это означает, что ваш код redux-saga на самом деле не выполняет сами побочные эффекты. Вместо этого вспомогательные функции, которые вы используете создать объекты, подобные задачам, которые представляют намерение сделать побочный эффект, а затем внутренняя библиотека выполняет его за вас. Это делает тестирование чрезвычайно легким, без необходимости издеваться и очень привлекательным для некоторых людей. Тем не менее, я лично обнаружил, что это означает, что ваши модульные тесты переопределяют большую часть логики вашей саги-делая эти тесты не очень полезными IMO (это мнение не разделяют все)
люди часто спрашивают, почему мы не делаем что-то подобное с возвращением наблюдаемой: для меня это принципиально несовместимо с нормальным идиоматическим Rx. В Rx мы используем операторы типа
.debounceTime()Это инкапсулирует логику, необходимую для дебатирования, но это означает, что если мы хотим сделать версию, которая фактически не выполняет дебатирование и вместо этого выдает объекты задачи с намерением, вы теперь потеряли силу Rx, потому что вы больше не можете просто цеплять операторы, потому что они будут работать на этом объекте задачи, а не на реальном результате операции. Это действительно трудно объяснить изящно. Это снова требует тяжелого понимания Rx, чтобы понять несовместимость подходов. Если вы действительно хотите что-то вроде этого, проверьте redux-cycles, который использует цикл.js и в основном имеет эти цели. Я нахожу, что это требует слишком много церемоний на мой вкус, но я призываю вас дать ему спину, если это вас интересует.Как упоминал Торбена, я не уклоняюсь от признания того, что redux-saga В настоящее время (10/13/16) является явным лидером комплекс управления эффект на клетку. Он был запущен раньше и имеет более надежное сообщество. Так что есть много привлекательности в использовании стандарта де-факто над новым ребенком на блоке. Я думаю, можно с уверенностью сказать, что если вы используете либо без предварительного знания, вы находитесь в некоторой путанице. Мы оба используем довольно продвинутые концепции, которые, как только вы "получите", делают сложное управление побочными эффектами намного проще, но до тех пор многие спотыкаются.
самый важный совет, который я могу дать, это не приносить любая из этих библиотек, прежде чем они вам понадобятся. Если вы делаете только простые вызовы ajax, вам, вероятно, они не нужны. redux-thunk глупо прост в освоении и обеспечивает достаточно для основ, но чем сложнее асинхронность, тем сложнее (или даже невозможно) она становится для redux-thunk. Но за возвращение-наблюдаемые/сага во многом она наиболее ярко проявляет себя в более сложные асинхронность. Есть еще много достоинств, используя обертывание-преобразователь с одним из остальных (вместе наблюдаемых/сага) в одном проекте! redux-thunk для вашего общего простого материала, а затем только с помощью redux-observable/saga для сложных вещей. Это отличный способ оставаться продуктивным, поэтому вы не боретесь с redux-observable/saga за вещи, которые были бы тривиальными с redux-thunk.
Я думаю, что есть вещи, которые вы должны принять во внимание.
- сложности
- Кодирование Стиле
- Обучение
- Контролепригодность
допустим, мы хотим получить пользователя из API
// Redux-Saga import axios from 'axios' function* watchSaga(){ yield takeEvery('fetch_user', fetchUser) // waiting for action (fetch_user) } function* fetchUser(action){ try { yield put({type:'fetch_user_ing'}) const response = yield call(axios.get,'/api/users/1') yield put({type:'fetch_user_done',user:response.data}) } catch (error) { yield put({type:'fetch_user_error',error}) } } // Redux-Observable import axios from 'axios' const fetchUserEpic = action$ => action$ .ofType('fetch_user') .flatMap(()=> Observable.from(axios.get('/api/users/1')) // or use Observable.ajax .map(response=>({type:'fetch_user_done', user:response.data})) .catch(error => Observable.of({type:'fetch_user_error',error})) .startWith({type:'fetch_user_ing'}) )кроме того, я написал эту статью, чтобы сравнить различия между Redux-saga и Redux-Observable в глубине. Проверьте эта ссылка здесь или презентация.
Я использую Redux-Observable над Redux-Saga, потому что предпочитаю работать с наблюдаемыми над генераторами. Я использую его с RXJS, который является мощной библиотекой для работы с потоками данных. Подумайте об этом, как lodash для асинхронности. С точки зрения каких-либо недостатков, понял и компромиссов в выборе одного над другим, взгляните на ответ от Джея Фелпса:
redux-saga как проект существует дольше, чем redux-observable, так что это, безусловно, одна из основных продаж точка. Вы найдете больше документации, примеров и, вероятно, получите лучшую поддержку сообщества.
счетчик заключается в том, что операторы и API, которые вы изучаете в redux-saga, не так переносимы, как обучение RxJS, которое используется повсюду. redux-observable-это супер супер супер просто внутренне, это действительно просто дает вам естественный способ использовать RxJS. Так что если вы знаете RxJS (или хотите), это очень естественно.
мой совет на данный момент для большинства людей является то, что если вы должны спросить, какой из них вы должны использовать, вы, вероятно, должны выбрать redux-saga.
Я оцениваю переносимость между языками и средами выполнения, которые имеет Rx. Даже если ваше приложение не будет менять языки, ваша карьера может. Получите лучшее рычаги вы можете на вашем обучении, однако вы оцениваете это для себя. Это такой отличный шлюз для .Net LINQ в частности.
Redux-Observable-это потрясающая библиотека, мы используем ее в производстве в течение 1,5 лет без каких-либо проблем до сих пор, она отлично тестируется и может быть легко интегрирована с любой структурой. У нас есть чрезвычайно перегруженные параллельные каналы сокетов, и единственное, что спасает нас от замораживания, - это Redux-Observable
У меня есть 3 пункта, которые я хотел бы здесь упомянуть.
1. Сложность и кривая обучения
Redux-сага легко бьет возвращение наблюдаемой здесь. Если вам нужен только простой запрос на авторизацию, и вы не хотите использовать redux-thunk по некоторым причинам, вы должны рассмотреть возможность использования redux-saga, это просто легче понять.
Если у вас нет предварительного знания Observable это будет боль для вас и ваша команда будет курс вы:)
2. Что могут предложить мне Observable и RxJS?
когда дело доходит до асинхронной логики, заметен ваш швейцарский нож, Observable может буквально сделать почти все для вас. Вы никогда не должны сравнивать их с обещаниями или генераторами это намного мощнее, это то же самое, что сравнивать Optimus Prime с Chevrolet.
а как насчет RxJS? Это как лодаш.js но для асинхронной логики, как только вы войдете, вы никогда не переключитесь на что-то другое.
3. Реактивное расширение
просто проверьте эту ссылку
реактивные расширения реализуется для всех современных языков программирования, это просто ваш ключ к функциональному программированию.
Так что проведите свое время мудро узнать RxJS и использовать redux-observable:)
Comments