私のプロジェクトでは、これに使用shouldEmit
します ( https://github.com/reflux/refluxjs#action-hooksを参照)。私のコードの例:
var streamStore = Reflux.createStore({
[...]
});
actions.loadStream.shouldEmit = function(streamId) {
if(streamId in streamStore.data)
return false;
return true;
};
これはストア定義と同じファイルにあります。ストアはデータを保存するため、これは概念的に正しいアプローチだと思います。したがって、ストアは、より多くのデータが利用可能であるというアクションを聞いて更新する責任があるのと同じように、より多くのデータをロードする要求をインターセプトし、そうしないと言います。自体。
残念ながら、AJAX 呼び出しを にバインドしたため、これはあなたの例では機能しません。これは のpreEmit
前に呼び出されshouldEmit
ます。次のように、通常の呼び出しで API 呼び出しを行うようにリファクタリングすることをお勧めしますlisten
。
Actions.loadRequest.listen(function () {
$.get('/store/', function (data) {
Actions.loadSuccess(data);
}.bind(this));
});
これによりpreEmit
、アクションを発行する前にアクションの引数を書き換える必要があるというまれなケースが回避されます。コードでこのパターンを使用します。たとえば、結果の 2 ページ目を読み込むときにnext
、最初のページに付属していてストアにあるトークンに依存しています。しかし、「アクションがトリガーされたのでリクエストを作成する」という一般的な単純なケースでは、必要なキャッシングなどのより高度な動作を追加してlisten
追加できるため、使用する方が理にかなっています。preEmit
shouldEmit
Reflux にはヘルパー関数もありますlistenAndPromise
。これは、「アクションが起動され、AJAX 呼び出しが行われ、完了したら別のアクションが起動される」という一般的なユース ケースをさらに簡素化します。あなたの例は次のようになります。
Actions.loadRequest.listenAndPromise(function () {
return $.get('/store/');
});
設定方法の詳細については、ドキュメントのこのセクションを参照してください: https://github.com/reflux/refluxjs#asynchronous-actions