Partage
  • Partager sur Facebook
  • Partager sur Twitter

SetTimeOut l'un après l'autre

    7 juillet 2009 à 23:42:26

    Bonjour,

    J'ai une fonction de déplacement qui déplace un bonhomme sur une carte. Ma fonction doit être le plus générique possible pour cela voici sa signature :

    function deplacerElement(idElem,x,y)

    idElem représente l'identifiant de l'élément à déplacer, ici mon bonhomme et x et y sont les coordonnées à atteindre.

    Malheureusement je ne souhaite pas que mon bonhomme se déplace verticalement, pour cela j'ai pensé à appeler plusieurs fois la fonction deplacerElement : la première fois pour se déplacer verticalement et la seconde horizontalement. Malheureusement, le SetTimeOut n'est pas bloquant, donc les deux fonctions s'exécutent en même temps ce qui revient donc à un déplacement vertical.

    Savez vous comment exécuter un setTimeOut l'un après l'autre, par exemple :
    //D'abord on execute cette fonction
    deplacerElement('1',0,50);
    //Puis lorsque la première est terminée, on exécute la seconde !
    deplacerElement('1',50,0);

    Merci d'avance.


    • Partager sur Facebook
    • Partager sur Twitter
      8 juillet 2009 à 10:24:19

      Il faut que tu utilises le mécanisme du callback.

      Tu ajoutes un quatrième paramètre à ta fonction :
      deplacerElement(idElem,x,y,callback) . Cet argument sera une fonction. De sorte à ce que le corps de ta fonction soit quelque chose du genre :

      function deplacerElement(idElem,x,y,callback) {
        // On déplace...
      
        // Quand le déplacement est fini :
        if(callback) {
          callback();
        }
      }
      


      Cela te permettrait de faire finalement cet appel :

      deplacerElement('1',0,50,function() {
        deplacerElement('1',50,0);
      });
      
      • Partager sur Facebook
      • Partager sur Twitter
        8 juillet 2009 à 17:54:41

        Salut lecrycry,

        Il n'y a pas de solutions natives en javascript pour mettre plusieurs Timeouts à la suite, il te reste donc 2 solutions :
        Soit comme l'a suggéré Golmote, gérer les timeout en interne dans ta fonction,
        Soit réécrire setTimeout pour qu'il prenne en compte les précédent délais enregistrés.

        Et comme ça représentait un bon challenge, je me suis permis de créer un fonction qui s'occupe de ça ^^ .

        function $uid(oObj) {
        	return oObj.uid || (oObj.uid = $uid.UID++);
        }
        $uid.UID = 1;
        
        function Queue(fCallback, iTime, uid) {
        	if(!uid) {
        		uid = $uid(fCallback);
        	}
        	
        	if(!Queue.Storage[uid]) {
        		Queue.Storage[uid] = [];
        	}
        	
        	Queue.Storage[uid].push({
        		fCallback:	fCallback,
        		iTime:		iTime,
        		iTimeoutId:	false
        	});
        	
        	Queue.Next(uid);
        	
        	return uid;
        }
        Queue.Next = function(uid) {
        	var aList = Queue.Storage[uid];
        	
        	if(aList && aList.length) {
        		var oObj = aList[0];
        		if(oObj.iTimeoutId !== false) {
        			return false;
        		}
        		else {
        			oObj.iTimeoutId = setTimeout(function() {
        				aList.shift();
        				Queue.Next(uid);
        				oObj.fCallback();
        			}, oObj.iTime);
        			
        			return true;
        		}
        	}
        	else {
        		return false;
        	}
        };
        Queue.ClearFirst = function(uid) {
        	var aList = Queue.Storage[uid];
        	
        	if(aList && aList.length) {
        		clearTimeout(aList[0].iTimeoutId);
        		aList.shift();
        	}
        }
        Queue.ClearRunning = function(uid) {
        	Queue.ClearFirst(uid);
        	return Queue.Next(uid);
        };
        Queue.ClearAll = function(uid) {
        	Queue.ClearFirst(uid);
        	Queue.Storage[uid] = [];
        }
        Queue.Storage = [];
        


        L'utilisation est très simple :

        int Queue( function fCallback, int iTime [, mixed uid] )
        Cette fonction permet d'enregistrer la fonction fCallback pour qu'elle s'exécute iTime millisecondes après les autres fonctions enregistrées sous le même identifiant unique uid (int ou string).
        L'identifiant unique uid est facultatif. S'il n'est pas fourni, un identifiant unique sera créé pour la fonction fCallback au moyen de la fonction $uid.
        Renvoi l'identifiant unique de la fonction.
        Si la fonction passée en premier paramètre est une fonction anonyme, il faut obligatoirement donner un uid.


        bool Queue.Next( mixed uid )
        Lance le délai de la prochaine fonction enregistrée pour l'uid fournie.
        Renvoi true si le délai est lancé, sinon false.

        void Queue.ClearFirst( mixed uid )
        Supprime la première fonction enregistrée avec l'identifiant uid et arrête les délais pour cet uid

        void Queue.ClearRunning( mixed uid )
        Arrête le délai en cours pour l'uid fourni et démarre le délai suivant dans la liste.
        Renvoi true si le délai est lancé, sinon false.

        void Queue.ClearAll( mixed uid )
        Arrête le délai en cours pour l'uid fourni et supprime tous les délais suivants.


        À tester sur cette page.
        • Partager sur Facebook
        • Partager sur Twitter
          9 juillet 2009 à 1:43:47

          Huhu, tu t'es bien amusé Darkodam ! ^^ GG !

          Va falloir que je teste ça dès que j'aurais un peu plus de temps ;)
          • Partager sur Facebook
          • Partager sur Twitter
            9 juillet 2009 à 11:50:03

            Merci à vous deux, je vais tester cela.
            • Partager sur Facebook
            • Partager sur Twitter

            SetTimeOut l'un après l'autre

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown