7
votes

Code d'exécution lorsque deux événements ont déclenché

Ceci est principalement une question linguistique-agnostique.

Si j'attends que deux événements complètent (disons, deux événements IO ou des demandes HTTP), quel est le meilleur modèle pour y faire face. Une chose que je peux penser est la suivante (exemple pseudo JS). P>

request1.onComplete = function() {
  req1Completed = true;
  eventsCompleted();
}

request2.onComplete = function() {
  req2Completed = true;
  eventsCompleted();
}

eventsCompleted = function() {

  if (!req1Completed || !req2Completed) return;
  // do stuff

}


1 commentaires

Vous attendez-vous que ces événements se produisent dans un ordre particulier? Qui affecte grandement la solution.


4 Réponses :


2
votes

JQuery 1.5 a différé: http://api.jquerery.com/category/deferred- objet /

Vous pouvez facilement les configurer pour rappeler uniquement lorsque certains événements ont été déclenchés.


2 commentaires

Un "différé" est définitivement quelque chose à examiner. Il vous permet de créer une interface assez soignée pour suivre plusieurs rappels, quelque chose du long des lignes de après l'après-alinéa (DEF1, DEF2, DEF2, Fonction () {...}) ... Sauf si bien sûr jQuery a déjà quelque chose pour attendre plusieurs événements.


J'espère une solution générique, applicable à plusieurs langues.



4
votes

Avant même d'entrer dans les détails, voici quelque chose de soigné qui profite des fonctions Lambda éteint le sommet de ma tête: XXX

Cela suppose évidemment que chaque événement se déclenche le plus une fois et ne 't Profitez de l'ordre.


3 commentaires

Cette solution est meilleure si vous avez un nombre arbitraire d'événements que vous attendez, mais le fait que cela ne fonctionne que si les événements se produisent une fois est un peu dangereux.


C'est un peu slick. Un peu fou, mais maigre.


Pas une mauvaise solution; Celui-ci gagne, bien qu'une partie de moi sentent que c'est un peu une solution sale :)



1
votes

Essayez # 1 : Voici une solution qui ne nécessite pas de variables globales supplémentaires: xxx

Le gestionnaire des incendies d'événement d'abord effacera la vieille manutention de l'autre et attribuer un nouveau qui inclut les choses que vous devez faire après l'achèvement des deux événements. Parce que nous réaffectaons le second gestionnaire à l'intérieur du gestionnaire du premier événement (selon ce qui est), nous savons toujours que nous sommes terminés lorsque ce second gestionnaire finit.

Essayez # 2 : Voici quelque chose qui fonctionnera si chaque type d'événement est différent: xxx

par exemple, cela ne sera pas alerté "fait" jusqu'à ce que l'utilisateur ait à la fois défilé et cliqué sur: < / p> xxx

Essayez # 3 : L'essai précédent peut être modifié pour fonctionner pour des événements similaires: xxx < p> ... qui devrait être utilisé comme ceci: xxx

Fondamentalement, cela vérifie que deux rappels différents ont exécuté en stockant une référence à l'appel le plus récemment exécuté. Son utilisation est un peu maladroite, mais cela va faire le travail (c'est-à-dire que cela fonctionnera toujours si chacun des événements s'exécute plus d'une fois).


2 commentaires

demande1 et request2 regarder assez global pour moi


@Matti - Bien sûr qu'ils sont. Il est clair que je voulais dire qu'il ne nécessite pas de drapeaux globaux supplémentaires pour indiquer que chaque gestionnaire a fini.