Comment éviter l'envoi au milieu d'une dépêche

Dans mon Flux de l'architecture de Réagir application que je suis la récupération de données à partir d'un magasin, et voudrais créer une action de demander cette information si elle n'existe pas. Cependant, je suis en cours d'exécution dans une erreur si le répartiteur est déjà de l'expédition.

Mon code désiré est quelque chose comme:

getAll: function(options) {
  options = options || {};
  var key = JSON.stringify(options);
  var ratings = _data.ratings[key];

  if (!ratings) {
    RatingActions.fetchAll(options);
  }

  return ratings || [];
}

Cependant par intermittence échoue lorsque le répartiteur est déjà l'envoi d'action, avec le message Invariant Violation: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.. Je suis souvent en faisant des demandes en réponse à un changement dans l'état de l'application (par exemple, la plage de dates). Mon composant où je en faire la demande, en réponse à un événement de modification de la AppStore est la suivante:

getStateFromStores: function() {
  var dateOptions = {
    startDate: AppStore.getStartISOString(),
    endDate: AppStore.getEndISOString()
  };

  return {
    ratings: RatingStore.getAll(dateOptions),
  };
},

Je suis conscient que l'événement le chaînage est un Flux antipattern, mais je suis pas sûr de ce qu'est l'architecture de mieux pour récupérer les données lorsqu'il n'existe pas encore. Actuellement, je suis en utilisant cette terrible hack:

getAll: function(options) {
  options = options || {};
  var key = JSON.stringify(options);
  var ratings = _data.ratings[key];

  if (!ratings) {
    setTimeout(function() {
      if (!RatingActions.dispatcher.isDispatching()) {
        RatingActions.fetchAll(options);
      }
    }, 0);
  }

  return ratings || [];
},

Quelle serait une meilleure architecture qui permet d'éviter les cas de chaînage ou le répartiteur d'erreur? Est-ce vraiment le cas de chaînage? Je veux juste changer la base de données sur les paramètres de l'application.

Merci!

source d'informationauteur Ian Walker-Sperber | 2015-05-20