Flux Dispatch.dispatch (…): Não é possível despachar no meio de um despacho

Meu código https://gist.github.com/ButuzGOL/707d1605f63eef55e4af

Então, quando eu recebo um callback de sucesso, eu quero fazer um redirecionamento,
O redirecionamento também funciona através do dispatcher.

E estou recebendo Dispatch.dispatch (…): Não é possível despachar no meio de um despacho.

Existe algum hack para chamar a ação no meio?

Eu não vejo onde na essência que você postou você está fazendo o redirecionamento. Eu só vejo as ações AUTH_SIGNIN e AUTH_SIGNIN_SUCCESS, e elas parecem bem diretas.

Mas não, não há nenhum truque para criar uma ação no meio de um despacho, e isso é por design. As ações não devem ser coisas que causam uma mudança. Eles devem ser como um jornal que informa a aplicação de uma mudança no mundo exterior e, em seguida, o aplicativo responde a essa notícia. As lojas causam mudanças em si mesmas. Ações apenas informá-los.

Se você tiver esse erro, precisará fazer backup e verificar como está lidando com a ação original. Na maioria das vezes, você pode configurar seu aplicativo para responder à ação original, realizar tudo o que precisa fazer e evitar tentar criar uma segunda ação.

Você pode fazê-lo funcionar “agendando” a próxima ação em vez de chamá-la diretamente, aqui está um código de exemplo:

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

Isso fará com que seu próximo despacho seja chamado depois do processo de despacho atual, e nenhum erro ocorrerá.

Se o seu código de expedição estiver em um retorno de chamada, qualquer tipo de operação assíncrona também funcionará (por exemplo, em uma resposta para uma solicitação do Ajax).

Estou usando esse estilo para fazer alguns formulários responderem a dados genéricos aqui e não estou tendo problemas, pelo menos da maneira como estou usando.

Debounce é uma solução melhor:

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

Você pode verificar se o despachante está despachando, como:

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

você pode usar a opção “adiar” no despachante. No seu caso, seria como:

 Dispatcher.dispatch.defer(...); 
Intereting Posts