私の知る限り、間違っている場合は修正します redux-thunk は、 redux-promise Actionはプレーンオブジェクトのみをディスパッチする例外をスローするため、独自のメカニズムを実装しないと非同期関数を作成できませんでした。
これら2つのパッケージの主な違いは何ですか?単一ページのリアクションアプリで両方のパッケージを使用すること、またはredux-thunkに固執することで十分なメリットはありますか?
redux-thunk
を使用すると、アクション作成者は関数を返すことができます。
function myAction(payload){
return function(dispatch){
// use dispatch as you please
}
}
redux-promise
を使用すると、約束を返すことができます。
function myAction(payload){
return new Promise(function(resolve, reject){
resolve(someData); // redux-promise will dispatch someData
});
}
両方のライブラリは、非同期または条件付きでアクションをディスパッチする必要がある場合に役立ちます。 redux-thunk
を使用すると、1人のアクション作成者内で複数回ディスパッチすることもできます。どちらを選択するか、もう一方を選択するか、両方を選択するかは、ニーズ/スタイルに完全に依存します。
アプリで両方を一緒に使用する必要があります。 ルーチンのプロデュース非同期タスクのredux-promiseから開始し、複雑さが増すにつれてサンク(またはSagasなど)を追加するためにスケールアップします:
redux-promise
は人生を改善し、それを迅速かつ簡単に単純化します。 (一言で言えば、約束が解決するときに約束を「アンラップ」することを考える必要はなく、結果を記述/ディスパッチするのではなく、redux-promise(-middleware)がすべての退屈なものを処理してくれます。)これらの場合、redux-thunk
の利点は、action-creator内に複雑さをカプセル化できることです。
ただし、Thunkがpromiseを生成およびディスパッチする場合、両方のライブラリを一緒に使用する必要があることに注意してください:
redux-promise
は、Thunkによって生成された個々のプロミスのリデューサーでのアンラップを処理し、それに伴うボイラープレートを回避します。 (あなたはcould代わりにpromise.then(unwrapAndDispatchResult).catch(unwrapAndDispatchError)
...でサンクのすべてを行うことができますが、なぜですか?)ユースケースの違いを要約する別の簡単な方法:Reduxアクションサイクルの開始と終了:
redux-promise
は、フローのendに対応します。すべてが単純な約束まで煮詰められたら、それらをアンラップして、解決/拒否された値を保存するだけです。店舗redux-promise-middleware
は、元のredux-promise
の背後にあるアイデアのより完全で理解しやすい実装であると思います。それは活発に開発中であり、redux-promise-reducer
によってうまく補完されています。redux-saga
です。これはredux-thunk
に非常に似ていますが、ジェネレーター関数の構文に基づいています。繰り返しますが、redux-promise
と組み合わせて使用することになるでしょう。完全な開示:私はReduxの開発に比較的慣れていないため、この質問に苦労しました。私が見つけた最も簡潔な答えを言い換えます:
ReduxPromiseは、アクションがディスパッチされると「ペイロード」としてプロミスを返します。その後、「ReduxPromise」ミドルウェアはそのプロミスを解決し、結果をリデューサーに渡します。
一方、ReduxThunkは、「ディスパッチ」が呼び出されるまで、実際にアクションオブジェクトをリデューサーにディスパッチすることをアクションクリエーターに保留させます。
この情報を見つけたチュートリアルへのリンクは次のとおりです。 https://blog.tighten.co/react-101-part-4-firebase 。