ホームページ >ウェブフロントエンド >jsチュートリアル >React Reduxアプリケーションの非同期操作
キーポイント
この記事は、もともとCodebrahmaで公開されました。
JavaScriptは、単一の読み取りプログラミング言語です。つまり、次のコードを書くとき...
…2行目は、最初の行が実行された後にのみ実行されます。クライアントまたはサーバーは毎秒数百万の計算を実行するため、ほとんどの場合、これは問題になりません。費用のかかる計算を実行するときにのみこれらの効果に気付きます(完了するのにかなりの時間がかかるタスク - ネットワークリクエストは返すのに時間がかかります)。
ここにAPI呼び出し(ネットワークリクエスト)のみを表示しているのはなぜですか?他の非同期操作はどうですか? API呼び出しは、非同期操作を処理する方法を説明する非常にシンプルで便利な例です。 setTimeout()
、パフォーマンス集約型のコンピューティング、画像読み込み、イベント駆動型操作など、他の操作があります。
アプリケーションを構築するときは、非同期実行が構造にどのように影響するかを考慮する必要があります。たとえば、ブラウザからAPI呼び出し(ネットワーク要求)を実行する関数と考えてください。 (AJAX要求であるかどうかを無視してください。その動作を非同期または同期として扱うだけです。)サーバー上でリクエストが処理されたときに経過する時間はメインスレッドでは発生しません。したがって、JSコードは引き続き実行され、リクエストが応答を返すと、スレッドが更新されます。 fetch()
このコードを検討してください:
この場合、
userId = fetch(userEndPoint); // 从 userEndpoint 获取 userId userDetails = fetch(userEndpoint, userId) // 为此特定 userId 获取数据。は非同期であるため、
を取得しようとするとfetch()
はありません。したがって、最初の行が応答を返した後にのみ2行目が実行されるようにする方法でそれを構築する必要があります。 userDetails
最新のネットワークリクエストのほとんどは非同期です。ただし、以前のAPI応答データに依存しているため、これは常に機能するとは限りません。 Reactjs/Reduxアプリケーションで特別に構築する方法を見てみましょう。
Reactは、ユーザーインターフェイスを作成するためのフロントエンドライブラリです。 Reduxは、アプリケーションの状態全体を管理する状態容器です。 ReadとのReactを使用すると、効率的でスケーラブルなアプリケーションを作成できます。このようなReactアプリケーションでは、非同期操作を構築するいくつかの方法があります。各方法について、次の要因に関してその利点と短所について説明します。
1
userDetails
であると仮定します。応答に都市が含まれます。応答はオブジェクトになります:
エンドポイントが/details
であると仮定します。応答は配列になります:
userId = fetch(userEndPoint); // 从 userEndpoint 获取 userId userDetails = fetch(userEndpoint, userId) // 为此特定 userId 获取数据。
redux-saga/restuarants/:city
を使用します
Redux Observablesを使用して
userDetails: { … city: 'city', … };
私は、大規模なプロジェクトで最も一般的に使用される方法であるため、上記の方法を具体的に選択しました。特定のタスクにより具体的である可能性のある他の方法があり、複雑なアプリケーションに必要なすべての機能を持っているわけではありません(例:
setState
このようにして、州が(買収により)変更されると、コンポーネントがレストランリストを自動的に再レンダリングしてロードします。
両方の方法が最も簡単です。ロジック全体がコンポーネント内にあるため、コンポーネントがロードされた後、すべてのデータを一度に簡単に取得できます。この方法の欠点
複雑なデータベースの相互作用が発生すると問題が発生します。たとえば、次の状況を検討してください
ビジネスロジックを適切な場所に移動します。コンポーネントからビジネスロジックを移動することを検討した場合、これはどこでこれを行うことができますか?アクションで?還元剤で?ミドルウェアを通して? Reduxのアーキテクチャは同期しています。アクション(JSオブジェクト)を配布すると、ストレージに到達すると、還元剤が動作します。
非同期コードを実行する別のスレッドがあり、グローバル状態の変更はサブスクリプション
を配布でき、それが完了したらを配布できます。
React JSアプリケーションを開発したいですか? dispatch({ type: 'FETCH_STARTED' })
dispatch({ type: 'FETCH_SUCCESS' })
Redux Thunk
Redux Thunkは、Reduxのミドルウェアです。基本的に、オブジェクトの代わりにアクションとして関数を返すことができます。これは、関数のパラメーターとして
および
dispatch
関数内の複数の分布を許可しますgetState
dispatch
ビジネスロジックとの協会は、Reactコンポーネントからアクションに移動されます。
userId = fetch(userEndPoint); // 从 userEndpoint 获取 userId userDetails = fetch(userEndpoint, userId) // 为此特定 userId 获取数据。
ご覧のとおり、どのタイプのアクションが分散されているかを適切に制御できます。各関数呼び出し(fetchStarted()
、fetchUserDetailsSuccess()
、fetchRestaurantsSuccess()
、fetchError()
など)は、通常のJavaScriptオブジェクトのタイプのアクションを配布し、必要に応じて追加の詳細を追加できます。したがって、還元剤のタスクは、各アクションを処理し、ビューを更新することです。ここから簡単で、実装が異なる可能性があるため、Reducerについては説明しませんでした。
を呼び出すことができます。これにより、上記のすべてのタスクが処理され、還元剤に応じてビューを更新できます。 this.props.getRestaurants()
ただし、reduxサンクを使用して特定のタスクを実行することはまだ少し難しいです。たとえば、中間のフェッチ操作を一時停止するか、複数のそのような呼び出しがある場合のみ最新の通話を許可する必要があります。他のAPIがこのデータを取得してキャンセルする必要があります。
これらを実装できますが、正確に実行する方が複雑になります。他のライブラリと比較して、複雑なタスクのコードの明確さはわずかに悪化し、維持がより困難になります。
redux-saga
を使用しますRedux-Sagaは、次の目標を達成するのに役立つAPIを提供します。
イベントのブロック、いくつかの操作が完了するまで同じ行でスレッドをブロックする非ブロッキングイベント、コードを非同期
の単純なアクションを使用して配布すると、SAGAミドルウェアが聞き、応答します。実際、ミドルウェアではアクションは使用されていません。他のいくつかのタスクを聴いて実行するだけで、必要に応じて新しいアクションを配布します。このアーキテクチャを使用することにより、複数のリクエストを配布できます。それぞれが説明します。
さらに、
の利点を見ることができます。現在、ブロッキングコールを実装するために APIを使用しています。 SAGAは、非ブロッキングコールを実装するfetchRestaurantSaga()
などの他のAPIを提供します。ブロッキングと非ブロッキングコールを組み合わせて、アプリケーションに適した構造を維持できます。 call
スケーラビリティを使用すると、SAGAを使用することが有益です:fork()
特定のタスクに基づいてSAGAを構築およびグループ化できます。単にアクションを配布することで、別のサガからサガをトリガーできます。
叙事詩は、アクションストリームを受信し、アクションストリームを返す関数です。つまり、エピックは、還元剤がそれらを受信した後、通常のRedux配布チャネルと並行して実行されます。
SAGAと同様に、複数のアクションを配布できます。各アクションは、スレッドが現在入っているAPIリクエストチェーンのどの部分を説明しています。
userId = fetch(userEndPoint); // 从 userEndpoint 获取 userId userDetails = fetch(userEndpoint, userId) // 为此特定 userId 获取数据。スケーラビリティの観点から、特定のタスクに基づいて叙事詩を分割または組み合わせることができます。したがって、このライブラリは、スケーラブルなアプリケーションの構築に役立ちます。執筆コードの観察可能なパターンを理解すれば、コードの明確さは良好です。
私の好み
使用するライブラリを決定する方法は?これは、APIリクエストの複雑さによって異なります。
Redux-SagaとRedux-Observableのどちらかを選択するにはどうすればよいですか?学習ジェネレーターまたはRXJに依存します。どちらも異なる概念ですが、同様に十分です。どちらがあなたの方が良いかを両方にしようとすることをお勧めします。
CodeBrahmaのReact Development Articleをもっと読むことができます。
React-Reduxアプリケーションにおける非同期操作に関する
Redux Thunkは非同期操作の管理にどのように役立ちますか?
ReduxサンクとRedux Sagaの違いは何ですか?
Reduxの非同期操作でエラーを処理する方法は?
reduxで非同期アクションをテストする方法は?
やredux-mock-store
などのライブラリを使用できます。テストでは、非同期アクションを分配し、予想されるアクションが正しいペイロードで配布されていることを主張できます。 fetch-mock
nock
Reduxで非同期操作をキャンセルする方法は?
やtakeLatest
などの効果を提供します。たとえば、以前に開始されたSAGAタスクがまだ新しいアクションが分散されているときに実行されている場合、takeEvery
タスクをキャンセルします。 takeLatest
関数を呼び出すことができます。 dispatch
reduxの副作用に対処する方法は?
以上がReact Reduxアプリケーションの非同期操作の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。