11
votes

Réagir la chaîne de distribution de flux

J'essaie d'utiliser réagir avec l'architecture de flux et trébuché sur une restriction que je ne peux pas gérer. Le problème est comme suit:

  1. Il y a un magasin qui écoute un événement. L'événement a un identifiant d'objet. Nous devons récupérer des objets si nécessaire et le rendre sélectionné.
  2. Si le magasin n'a pas d'objet avec cet identifiant - il est interrogé. Dans Callback, nous envoyons un autre événement à stocker, qui est responsable de la sélection.
  3. Si Store a un objet - j'aimerais envoyer des événements de sélection, mais je ne peux pas parce que l'envoi est en cours.

    La meilleure solution que je suis arrivée jusqu'à présent consiste à envelopper l'envoi interne dans Settimeout (F, 0) , mais il semble effrayant.

    réellement le problème est Toutement général - Comment dois-je organiser une chaîne d'expédition sans envoi d'envoi (sans violer les restrictions de flux de courant) si chaque nouvel envoi est basé sur le résultat de la manipulation de l'envoi précédent.

    Quelqu'un a-t-il de bonnes approches pour résoudre ces problèmes? / p> xxx


0 commentaires

3 Réponses :


2
votes

Écrivez-vous votre propre répartiteur? Settimeout (F, 0) est un bon tour. Je fais la même chose dans mon flux minimal ici . Rien d'effrayant là-bas. Javascript's Modèle de concurrence est assez simple.

Des implémentations de répartiteurs de flux plus robustes doivent gérer cela pour vous.


7 commentaires

Hourra pour Micro Flux implémentations :) Pas comme s'il n'y a pas de tonne déjà, mais voici la mienne CAPTRAY.GITUB .io / Vanilla-Flux


Et en ce qui concerne la question, il est correct de créer de nouvelles actions à partir d'un magasin, mais on dirait que vous essayez de le faire avant que votre répartiteur ait fini de dépêcher. Cependant, voir le mot "sélectionné / sélection" dans des sons comme l'état de l'UI se plie à votre état d'application. Cela pourrait valoir la peine de repenser ou de retenir vos actions. Difficile à dire sans plus de contexte.


@ Z5H Non, j'essayais de rester à Mise en œuvre FB . J'ai essayé de rechercher des solutions sur le Web mais n'a pas trouvé que des personnes qui disent que la chaîne de distribution est vraiment mauvaise. Je n'aime pas Trick avec Settimeout (F, 0) Parce que cela ressemble à ce que je fais la même chaîne (que je ne pense pas réellement est mauvais mais a tendance à faire confiance aux garçons intelligents) avec des solutions de contournement . Merci pour le lien MDN! Il semble que j'ai vraiment besoin de connaissances fondamentales!


@captray Votre implémentation est très similaire à celle de FB (en termes de fonctionnalité). En ce qui concerne: Exactement, j'essaie d'envoier d'une autre expédition, car seul le deuxième lieu de Dispatch a des données à expédier. Je stocke la sélection dans l'état de l'application car il existe un concept de sélection actuelle pour l'ensemble de la demande. Peut-être que ce n'est vraiment pas si bonne idée.


C'est en fait exactement la même chose. Je viens d'inclure un événement JS personnalisé et un réacteur au lieu de dépendre de l'émetteur d'événement ou d'autres solutions. Encore une fois, il est difficile de dire sans voir le code. Point 1 ci-dessus dit que votre magasin écoute un événement? Les magasins ne doivent vraiment recevoir que des charges utiles de données via la fonction de rappel fournie au répartiteur lorsque le magasin enregistre avec le répartiteur. Votre magasin a-t-il écouté un autre événement en dehors du répartiteur régulier -> Store -> Flux de composants?


@captray j'ai ajouté l'exemple. L'endroit que je suis intéressé à faire est le premier appel à selectitem . Je l'ai fait fonctionner en emballant avec Settimeout (f, 0) . En fait, j'ai suivi vos conseils et j'ai déplacé des informations de sélection dans l'état de la composante quasi-racine, mais je suis à peu près sûr que je vais rencontrer des problèmes similaires bientôt.


Il est dommage qu'il n'y ait pas de mise en œuvre solide que les fossés Settimeout Trick Nasty Trick encore



0
votes

Ainsi, dans la recherche de votre code, définissez-vous une propriété "sélectionnée" de l'article afin qu'elle soit cochée / sélectionnée dans votre UI / composant? Si tel est le cas, faites simplement cette partie de la fonction que vous êtes déjà dans.

var Store = (function(){

    var _currentItem = {};
    var _currentItemID = 1;

    function selectItem(item) {

          _currentItem = item;
          _currentItemID = item.id;
          emitChange();
    }


    (function() {
         Dispatcher.register(function(action){
               case AppConstants.ITEM_REQUESTED:
                   var item = SomeStore.getItem(action.itemId);
                   if (item) {
                        selectItem(item);
                   } else {
                   $.getJSON(`some/${action.itemId}`, (item) => 
                        selectItem(item);   
                   }
         });
    })();


    return {
         getCurrentlySelectedItem: function() {
              return _currentItem;
         },
         getCurrentlySelectedItemID: function() {
              return _currentItemID;
         }
    }

})();


0 commentaires

2
votes

si item_select est un événement qu'un autre stockage va gérer:

Vous recherchez Dispatcher.waitfor (tableau IDS): vide , qui permet Vous utilisez le somestore.dispatchToken que registre () retourne pour appliquer l'ordre dans lequel les magasins gèrent un événement.

Le magasin, disons que nous l'appelons Otherstore , qui gérerait l'événement item_Select , devrait plutôt gérer item_request événement, mais appeler Dispatcher.waitfor ([Somestore.dispatToken] ) Tout d'abord, puis obtenez tout le résultat est intéressant de somestore via une méthode publique, comme somestore.getem () .

< fort> mais de votre exemple, il semble que Somestore ne fait rien à son état interne avec item_request , vous devez donc simplement avoir besoin de déplacer le lin suivant es dans Otherstore avec quelques modifications mineures : xxx

et encore, si un autre magasin doit gérer le résultat de Otherstore.Dosomethi (Item) , ils peuvent également gérer item_Requested , mais appeler répartiteur.waitfor ([Otherstore.dispatToken]) avant de continuer. < / p>


2 commentaires

Les exemples ne le montrent pas mais Somestore gère réellement le message. Votre approche est belle et résolvez un problème, je suppose que cela ne résout pas le problème en général. Si Somestore pendant la manipulation des messages peut envoyer des types d'action différents, alors avec votre approche, vous devez transporter cette logique sur les magasins de points finaux.


Ce que j'essaie de dire, c'est que Somestore ne devrait pas Dispêcher des types d'action différents lors de la manipulation des messages. Les développeurs de flux le pensent également, c'est pourquoi ils comprenaient waitfor parmi les quelques méthodes disponibles dans la mise en œuvre de leur répartiteur. waitfor résout le problème en général. Je pense que vous devriez envisager une chaîne d'événement comme anti-motif et reconsidérer comment vous gérez les événements. Peut-être inclure plus de détails sur votre exemple spécifique?