よし、reactjs、フラックス アーキテクチャ、react-router の問題で立ち往生しています。次のルートがあります(ルートの一部のみ):
<Route name="prepare-seniors">
<Route name="senior" path=":candidateId" handler={SeniorCandidate}>
<DefaultRoute handler={SeniorProfile}/>
<Route name="senior-recommendations" path="recommends">
<DefaultRoute handler={SeniorRecommends}/>
<Route name="senior-rec-new" path="new"/>
</Route>
</Route>
</Route>
シニア プロファイル ビューは、個人のデータをロードする API 呼び出しを行います。[おすすめ] ビューに移動すると、個人の ID を使用して別の呼び出しが行われ、おすすめが読み込まれます。最初にプロフィール ページを実際に表示して、おすすめページに移動するとうまくいきます。しかし、ハードリロードを行うと、次のようになります。
Uncaught Error: Invariant Violation: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.
これは、最初の API が戻った後にディスパッチが呼び出され、コンポーネントの更新が開始されるためです。レコメンデーション ページが終了する前に、その API を呼び出し、その結果をディスパッチしようとします。React.addons.batchUpdates はこれを修正する方法であるとフォーラムで読みましたが、それを機能させる方法がわかりませんでした。GitHub Batch Updates Issueと、同様のことについて説明している別のリンク hereを使用しようとしています。最初のものは、以下を追加してディスパッチャを調整することを推奨しています:
// assuming a var `flux` containing your Flux instance...
var oldDispatch = flux.dispatcher.dispatch.bind(flux.dispatcher);
flux.dispatcher.dispatch = function(action) {
React.addons.batchedUpdates(function() {
oldDispatch(action);
});
};
しかし、私はこれを機能させることができませんでした。多分私はそれを間違って実装しています。
Chat と TodoMVC の例を読みました。チャットの例で waitFor がどのように使用されているかは理解できますが、どちらも同じ API を使用しているため、一方が他方を待つことは明らかです。私の問題には、API とディスパッチの間の競合状態が関係しています...そして、setTimeout は良い解決策ではないと思います。
私が必要としているのは、ディスパッチまたは API 呼び出しをキューに入れるようにディスパッチャを設定する方法を確認することです。または、各コンポーネントにそのデータの API 呼び出しを行うように指示するより良い方法であるため、ディスパッチの問題さえありません。
ああ、ここに私の Dispatcher.js ファイルがあるので、それがどのように設定されているかを見ることができます:
'use strict';
var flux = require('flux'),
Dispatcher = require('flux').Dispatcher,
React = require('react'),
PayloadSources = require('../constants/PayloadSources'),
assign = require('object-assign');
//var oldDispatcher = flux.Dispatcher.dispatch.bind(AppDispatcher);
//
//flux.dispatcher.dispatch = function(action) {
// React.addons.batchedUpdates(function() {
// oldDispatcher(action);
// });
//};
var AppDispatcher = assign(new Dispatcher(), {
handleServerAction: function(action) {
var payload = {
source: PayloadSources.SERVER_ACTION,
action: action
};
this.dispatch(payload);
},
handleViewAction: function(action) {
if (!action.type) {
throw new Error('Empty action.type: you likely mistyped the action.');
}
var payload = {
source: PayloadSources.VIEW_ACTION,
action: action
};
this.dispatch(payload);
}
});
module.exports = AppDispatcher;