2015-11-13 3 views
2

J'utilise des événements dans JQuery pour communiquer entre différents modules JavaScript. Ainsi, dans l'un des modules j'ai quelque chose comme ceci:JQuery - empêche le déclenchement de plusieurs événements

$(window).on('updateStatusRequest', function(ev) { 
    // Send updateStatus event after fetching data 
    data = fetchData(); 
    $(window).trigger('updateStatus', data); 
}); 

Et ces données peuvent potentiellement durer chercher longtemps (il envoie la requête HTTP en dehors) avant de terminer. Voici un problème auquel je pense maintenant: que se passe-t-il si beaucoup de 'updateStatusRequest' sont déclenchés et que la fonction n'a pas encore récupéré les données? Je veux éviter que plusieurs données va chercher dans ce cas, alors je pense à quelque chose comme ceci:

$(window).on('updateStatusRequest', function(ev) { 
    $(window).off('updateStatusRequest', this); 
    // Send updateStatus event after fetching data 
    data = fetchData(); 
    $(window).trigger('updateStatus', data); 
    $(window).on('updateStatusRequest', this); 
}); 

Je veux tourner le rappel au large lors de son exécution. Malheureusement, l'approche ci-dessus ne fonctionne pas. Quelle est la bonne façon de faire cela?

+0

Hm ... « ' fetchData' prend beaucoup de temps » ... avant de continuer à ce sujet, pouvez-vous s'il vous plaît me assurer que vous n'utilisez les requêtes synchrones? – Katana314

+0

J'utilise 'getJSON()' de JQuery pour récupérer des données, je n'ai pas trouvé dans sa documentation si elle est asynchrone ou non, mais je suppose que c'est en contact avec l'extérieur. – qiubit

+0

Alternativement à la réponse de Howard, vous pouvez simplement enrouler le contenu de votre fonction dans une instruction if, qui vérifie une variable globale, if (! Fetching) {fetching = true; ...} et redéfinir fetching sur fetchData completion. – DrunkWolf

Répondre

2

Vous avez besoin d'un rappel lorsque vous ajoutez le gestionnaire d'événements de retour dans quelque chose comme cela devrait fonctionner.

$(window).on('updateStatusRequest', function(ev) { 
    newFunction(); 
}); 

var newFunction = function(){ 
    $(window).off('updateStatusRequest'); 
    data = fetchData(); 
    $(window).trigger('updateStatus', data); 
    $(window).on('updateStatusRequest', function(){ 
     newFunction(); 
    }); 
} 

Bien que, je ne serais probablement utiliser une promesse au lieu d'ajouter/enlever les gestionnaires d'événements ...

+0

Merci pour cette référence de la promesse, va probablement l'utiliser car il est plus clair – qiubit

+0

aucun problème - les promesses sont grandes, je les utilise tout le temps. –