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:
La meilleure solution que je suis arrivée jusqu'à présent consiste à envelopper l'envoi interne dans 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. P> Quelqu'un a-t-il de bonnes approches pour résoudre ces problèmes? / p> Settimeout (F, 0) code>, mais il semble effrayant. P>
3 Réponses :
Écrivez-vous votre propre répartiteur? Des implémentations de répartiteurs de flux plus robustes doivent gérer cela pour vous. P> Settimeout (F, 0) Code> 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. p>
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) Code> 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 code>. Je l'ai fait fonctionner en emballant avec
Settimeout (f, 0) code>. 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 CODE> Trick Nasty Trick encore
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; } } })();
si strud> Vous recherchez Le magasin, disons que nous l'appelons < fort> mais strong> de votre exemple, il semble que Somestore ne fait rien à son état interne avec et encore, si un autre magasin doit gérer le résultat de item_select code> est un événement qu'un autre stockage code> va gérer:
Dispatcher.waitfor (tableau
, qui permet Vous utilisez le somestore.dispatchToken code> que
registre () code> retourne pour appliquer l'ordre dans lequel les magasins gèrent un événement. P>
Otherstore code>, qui gérerait l'événement
item_Select CODE>, devrait plutôt gérer
item_request code> événement, mais appeler
Dispatcher.waitfor ([Somestore.dispatToken] ) code> Tout d'abord, puis obtenez tout le résultat est intéressant de
somestore code> via une méthode publique, comme
somestore.getem () code>. p>
item_request code>, vous devez donc simplement avoir besoin de déplacer le lin suivant es dans
Otherstore code> avec quelques modifications mineures
Otherstore.Dosomethi (Item) Code>, ils peuvent également gérer
item_Requested code>, mais appeler
répartiteur.waitfor ([Otherstore.dispatToken]) code> avant de continuer. < / p> p>
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 i> 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 code> parmi les quelques méthodes disponibles dans la mise en œuvre de leur répartiteur.
waitfor code> 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?