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(...);