web-dev-qa-db-fra.com

Flux Dispatch.dispatch (...): impossible d'envoyer au milieu d'une expédition

Mon code https://Gist.github.com/ButuzGOL/707d1605f63eef55e4af

Donc, lorsque je reçois un rappel de connexion, je veux rediriger,
La redirection fonctionne également via le répartiteur.

Et je reçois Dispatch.dispatch (...): Impossible d'envoyer au milieu d'une expédition.

Y a-t-il un hack pour appeler l'action au milieu?

21
ButuzGOL

Je ne vois pas où dans le Gist que vous avez publié, vous effectuez la redirection. Je ne vois que les actions AUTH_SIGNIN et AUTH_SIGNIN_SUCCESS, et elles semblent assez simples.

Mais non, il n'y a pas de hack pour créer une action au milieu d'une dépêche, et c'est par conception. Les actions ne sont pas censées être des choses qui provoquent un changement. Ils sont censés être comme un journal qui informe l'application d'un changement dans le monde extérieur, puis l'application répond à cette nouvelle. Les magasins provoquent des changements en eux-mêmes. Les actions les informent simplement.

Si vous avez cette erreur, vous devez sauvegarder et voir comment vous gérez l'action d'origine. Le plus souvent, vous pouvez configurer votre application pour répondre à l'action d'origine, accomplir tout ce que vous devez faire et éviter d'essayer de créer une deuxième action.

27
fisherwebdev

Vous pouvez le faire fonctionner en "planifiant" l'action suivante au lieu de l'appeler directement, voici un exemple de code:

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

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

Cela entraînera votre prochaine expédition à être appelée plus tard hors du processus d'expédition actuel, et aucune erreur ne se produira.

Si votre code de répartition est sur un rappel, toute autre opération asynchrone qui fonctionnera également (par exemple dans une réponse à une demande Ajax).

J'utilise ce style pour que certains formulaires répondent aux données génériques ici et je ne fais face à aucun problème, du moins la façon dont je l'utilise.

6
Wilker Lucio

L'anti-rebond est une meilleure solution:

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