web-dev-qa-db-ja.com

Flux Dispatch.dispatch(...):ディスパッチの最中にディスパッチすることはできません

私のコード https://Gist.github.com/ButuzGOL/707d1605f63eef55e4af

サインイン成功コールバックを受け取ったら、リダイレクトを行いたいので、
リダイレクトもディスパッチャー経由で機能します。

そして、Dispatch.dispatch(...)を取得しています。発送の途中で発送できません。

途中でアクションを呼び出すハックはありますか?

21
ButuzGOL

あなたが投稿したGistのどこでリダイレクトを行っているのかわかりません。 AUTH_SIGNINアクションとAUTH_SIGNIN_SUCCESSアクションのみが表示され、それらは非常に簡単に見えます。

しかし、いいえ、ディスパッチの途中でアクションを作成するハックはありません。これは仕様によるものです。アクションは、変化を引き起こすものではありません。それらは、外界の変化をアプリケーションに通知し、アプリケーションがそのニュースに応答する新聞のようなものであるはずです。店はそれ自体に変化をもたらします。アクションはそれらに通知するだけです。

このエラーが発生した場合は、バックアップして、元のアクションの処理方法を確認する必要があります。ほとんどの場合、元のアクションに応答するようにアプリケーションを設定し、必要なすべてのことを実行し、2番目のアクションの作成を回避できます。

27
fisherwebdev

次のアクションを直接呼び出すのではなく、「スケジュール」することで機能させることができます。コード例は次のとおりです。

// instead of doing this
Dispatcher.dispatch(...);

// go like this
setTimeout(function() {
  Dispatcher.dispatch(...);
}, 1);

これにより、次のディスパッチが現在のディスパッチプロセスから後で呼び出され、エラーは発生しません。

ディスパッチコードがコールバックにある場合、同様に機能する他のあらゆる種類の非同期操作(Ajax要求に対する応答など)。

私はこのスタイルを使用して、いくつかのフォームがここで一般的なデータに応答するようにしており、少なくともそれを使用している方法では問題に直面していません。

6
Wilker Lucio

デバウンスはより良いソリューションです:

var _ = require('lodash');
var CHANGE_EVENT = "change";
var ApplicationStore = _.extend({}, EventEmitter.prototype, {

  emitChange: function() {
    this.emit(CHANGE_EVENT);
  },

  addChangeListener: function(callback) {
    this.on(CHANGE_EVENT, _.debounce(callback, 100));
  },

 removeChangeListener: function(callback) {
    this.removeListener(CHANGE_EVENT, callback);
  },

  getState: function(){
    return {
      showConsole: _showConsole
    }
  }
});
1
backslash112