2015-09-22 1 views
1

Je crée un petit jeu dans JS où beaucoup d'événements se produisent et souvent en même temps (comme modifier les éléments html ou globals js variables ..)Comment gérer plusieurs événements en même temps?

Pour gérer cela, j'utilise un "setInterval" "qui boucle toutes les 1ms pour regarder dans une table s'il y a quelque chose à faire (" demandes ")

Je remplis la table chaque fois que j'ai besoin de changer quelque chose sur la page, mais parfois j'ai besoin de changer plusieurs choses à la en même temps.

Le problème est qu'il ne se met pas à jour en même temps, il est retardé lorsqu'il y a 2,3 demandes ou plus en même temps. Je voudrais que ce soit instantané et s'il y a 2 demandes ou plus à faire en même temps, il devrait le faire en même temps et ne pas retarder chaque requête (exemple de requêtes: mise à jour de la largeur d'un div en jquery) .

Merci pour l'aide ..

var queue = {}; 

var fixedUpdate = setInterval(function() { //do all the requests in queue 

    $.each(queue, function(key, val) { //for each request present in the queue 

     //do something (requests are about updating display or some global variables) 

     /*...*/ 

     //after completing the request we delete it from the queue 
     delete queue[key]; 
    }); 

}, 1); 
+0

Vous ne pouvez pas vous attendre à ce que 'setInterval' vous donne un intervalle fixe - il peut varier beaucoup, et 1ms est généralement une résolution trop fine. – caasjj

+0

c'est une mauvaise nouvelle :(y at-il une alternative? – Owow

+0

vous allez dans le mauvais sens - JS n'est pas un environnement en temps réel, c'est un environnement asynchrone.Sans savoir plus de ce que vous faites, il est difficile de vous donner des pointeurs, mais pour mettre à jour quoi que ce soit à l'écran, vous devez vous connecter à 'requestAnimationFrame'. – caasjj

Répondre

0

Je viens de trouver ce qui causait le retard .... J'avais une fonction qui créait un temps de répétition aléatoire entre deux valeurs (min max), mais j'y ai échoué et la fonction renvoyait une valeur aléatoire MÊME lorsque vous lui donnez les deux valeurs min et max.

2

vote une file d'attente n'est pas une façon appropriée d'écrire. Javascript En raison de la nature à thread unique de Javascript dans le navigateur, vous n'obtiendrez pas une bonne réactivité dans la quasi-totalité de votre application si vous interrogez continuellement une file d'attente sur un court intervalle.

Javascript est construit à partir de la base pour être un langage axé sur les événements et il fonctionne efficacement lorsqu'il est utilisé de manière événementielle.

Vous devez avoir des événements qui mettent des éléments dans la file d'attente. Vous devez déclencher le traitement de la file d'attente quand quelque chose est ajouté à la file d'attente, PAS avoir un temporisateur séparé qui interroge la file d'attente. Déclencher le traitement de la file d'attente quand les choses sont ajoutées à la file d'attente vous donnera également une réponse immédiate plutôt que d'avoir un retard de minuterie. Et, plus loin quand vous finissez de traiter un événement dans la file d'attente, votre code devrait vérifier s'il y a quelque chose d'autre dans la file d'attente et le traiter aussi. Ainsi, tous les éléments mis en file d'attente sont traités au plus près de leur date d'ajout à la file d'attente dans un environnement à un seul thread. En outre, le navigateur JavaScript principal est à un seul thread, donc vous ne traiterez qu'un seul élément en file d'attente à la fois. Vous ne pouvez pas traiter plusieurs demandes au même instant. Le navigateur a de vrais threads avec webWorkers, mais ceux qui ne peuvent pas accéder au DOM ne sont probablement pas pertinents ici. En outre, conformément à la spécification HTML5, le temps minimum pour setInterval() est de 5 ms et ce uniquement si aucun autre code n'est exécuté à ce moment-là.

+0

Merci pour la clarification mais comme j'avais peur, ce n'est pas compatible avec ce que je veux faire .. je cherche une autre façon de le faire, je peux aller avec Unity mais JS était plus facile pour moi:/ – Owow

+2

@ user4792376 - Je pense que ce qui se passe réellement, c'est que votre pensée actuelle sur la façon dont votre application est conçue n'est pas compatible avec le fonctionnement de Javascript. Je suis persuadé qu'il existe un design compatible avec la façon dont Javascript fonctionne, mais qui nécessite une nouvelle conception. – jfriend00