Flux Dispatch.dispatch(...): отправка невозможно в середине отправки

Мой код https://gist.github.com/ButuzGOL/707d1605f63eef55e4af

Итак, когда я получаю ответный вызов с успешным завершением регистрации, я хочу сделать перенаправление,
перенаправление работает также через диспетчера.

И я получаю Dispatch.dispatch(...): Не могу отправить сообщение в середине отправки.

Есть ли способ взломать вызов в середине?

Ответ 1

Я не вижу, где вы указали, что вы делаете перенаправление. Я вижу только действия AUTH_SIGNIN и AUTH_SIGNIN_SUCCESS, и они выглядят довольно просто.

Но нет, нет никакого взлома для создания действия в середине отправки, и это по дизайну. Действия не должны быть вещами, которые вызывают изменения. Они должны быть похожи на газету, которая информирует о применении изменений во внешнем мире, а затем приложение реагирует на эти новости. Магазины создают изменения сами по себе. Действия просто информируют их.

Если у вас есть эта ошибка, вам необходимо создать резервную копию и посмотреть, как вы обрабатываете исходное действие. Чаще всего вы можете настроить приложение для ответа на исходное действие, выполнить все, что вам нужно, и не пытаться создать второе действие.

Ответ 2

Вы можете заставить его работать, "планируя" следующее действие вместо прямого вызова, вот пример кода:

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

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

Это приведет к тому, что следующая отправка будет вызвана позже из текущего процесса отправки, и ошибка не будет.

Если ваш код отправки находится в обратном вызове, любая другая асинхронная операция, которая будет работать (например, в ответе на запрос Ajax).

Я использую этот стиль, чтобы некоторые формы отвечали на общие данные здесь, и я не сталкиваюсь с какой-либо проблемой, по крайней мере, тем, как я ее использую.

Ответ 3

Debouncing - лучшее решение:

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
    }
  }
});

Ответ 4

Вы можете проверить, отправляется диспетчер, например:

if(!MyDispatcher.isDispatching()) {
    MyDispatcher.dispatch({...});
}

Ответ 5

вы можете использовать опцию "Отложить" в диспетчере. В вашем случае это будет выглядеть так:

Dispatcher.dispatch.defer(...);