[解決済み】Fluxアプリでajaxリクエストはどこで行うべきか?
2022-04-15 12:51:32
質問
fluxアーキテクチャのreact.jsアプリケーションを作成していますが、サーバーからのデータ要求がいつ、どこで行われるべきかを考えています。このための例はありますか?(TODOアプリではありません!)
どのように解決するのですか?
私は、非同期の書き込み操作をアクション・クリエーターに、非同期の読み込み操作をストアに置くことを大賛成しています。目的は、ストアの状態を変更するコードを完全に同期的なアクション・ハンドラに置くことです。これによって、アクション・ハンドラは理屈が簡単で、ユニットテストも簡単になります。同じエンドポイントへの複数同時リクエスト(例えば二重読み込み)を防ぐために、実際のリクエスト処理をプロミスを使った別のモジュールに移します。
class MyResourceDAO {
get(id) {
if (!this.promises[id]) {
this.promises[id] = new Promise((resolve, reject) => {
// ajax handling here...
});
}
return this.promises[id];
}
}
ストアの読み込みには非同期関数が含まれますが、重要な注意点として、ストアは非同期ハンドラで自分自身を更新せず、アクションを発火して のみ は、応答が到着したときにアクションを実行します。このアクションのハンドラが、実際の状態変更を行うことになる。
例えば、あるコンポーネントは次のようなことをする。
getInitialState() {
return { data: myStore.getSomeData(this.props.id) };
}
ストアには、おそらくこのようなメソッドが実装されているはずです。
class Store {
getSomeData(id) {
if (!this.cache[id]) {
MyResurceDAO.get(id).then(this.updateFromServer);
this.cache[id] = LOADING_TOKEN;
// LOADING_TOKEN is a unique value of some kind
// that the component can use to know that the
// value is not yet available.
}
return this.cache[id];
}
updateFromServer(response) {
fluxDispatcher.dispatch({
type: "DATA_FROM_SERVER",
payload: {id: response.id, data: response}
});
}
// this handles the "DATA_FROM_SERVER" action
handleDataFromServer(action) {
this.cache[action.payload.id] = action.payload.data;
this.emit("change"); // or whatever you do to re-render your app
}
}
関連
-
[解決済み】Uncaught SyntaxError: JSONの位置0に予期しないトークンuがあります。
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】<select>で現在選択されている<option>をJavaScriptで取得するにはどうすればよいですか?
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] ngModel' は 'input' の既知のプロパティではないため、バインドできません。
-
[解決済み] 1...N を含む配列の作成方法
-
[解決済み] HTMLマークアップのどこに<script>タグを記述すればよいですか?
-
[解決済み] どうすればjQueryに非同期ではなく、同期のAjaxリクエストを実行させることができますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
vueネットワークリクエストソリューション ネイティブネットワークリクエストとjsネットワークリクエストライブラリ
-
JSアレイループと効率解析の比較
-
WeChatアプレット用ユニアプリによるグローバルシェアリング
-
JavaScriptの配列共通メソッド解説
-
vueが定義するプライベートフィルタと基本的な使い方
-
Vueのイベント処理とイベントモディファイアの解説
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR