147

Redux-Sagaを使用しました。それを使って書かれたコードは、JS ジェネレーター関数がときどき頭を悩ませていることを除けば、今のところ簡単に推論できます。私の理解では、Redux-Observableは、ジェネレーター関数を使用せずに、副作用を処理する同様の仕事を達成できます。

ただし、Redux-Observable のドキュメントでは、Redux-Saga に対して優れている理由について多くの意見が提供されていません。ジェネレーター関数を使用しないことが Redux-Observable を使用する唯一の利点であるかどうかを知りたいです。また、Redux-Saga の代わりに Redux-Observable を使用することの欠点、落とし穴、または妥協点は何でしょうか? 前もって感謝します。

4

7 に答える 7

68

考慮しなければならない点もあると思います。

  1. 複雑
  2. コーディング スタイル
  3. 学習曲線
  4. テスト容易性

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 の違いを詳しく比較するために、この記事を書きました。こちらのリンクまたはプレゼンテーションをご覧ください。

于 2017-01-13T04:09:29.313 に答える
25

私は Redux-Saga よりも Redux-Observable を使用しています。データのストリームを操作するための強力なライブラリである RXJS と共に使用します。async の lodash のようなものと考えてください。どちらかを選択する際の欠点、落とし穴、妥協点については、Jay Phelps からのこの回答をご覧ください。

プロジェクトとしての redux-saga は redux-observable よりも長く存在しているため、これは確かに 1 つの主要なセールス ポイントです。より多くのドキュメント、例を見つけることができ、サポートを受けるためのより良いコミュニティがある可能性があります。

反対に、redux-saga で学習するオペレーターと API は、あらゆる場所で使用されている RxJS を学習するのと同じように転用することはできません。redux-observable は内部的に超超超シンプルで、RxJS を自然に使用する方法を提供するだけです。したがって、RxJS を知っている (または知りたい) 場合は、非常に自然に適合します。

現時点でほとんどの人への私のアドバイスは、どちらを使用する必要があるかを尋ねなければならない場合は、おそらく redux-saga を選択する必要があるということです。

于 2016-10-13T13:35:26.783 に答える