Auteur Sujet: Javascript ou Jquery : stopper l'execution en cours d'une fonction  (Lu 12886 fois)

Hors ligne Damocorp

  • Membre Junior
  • **
  • Messages: 93
  • Karma: +0/-0
    • Damocorp Space War
Salut,

J'ai des fonctions imbriquer les unes dans les autres. Et la fonction qui est en bout de liste ici est celle-ci :

$.fn.typewriter = function(id,opt,callback) {
        $(id).css("display","block");
        var i=0;
        var typeone = function(self, text, content) {
                if (text.length > 0) {
                        i=i+1;
                        var next = text.match(/(\s*(<[^>]*>)?)*(&.*?;|.?)/)[0];
                        text = text.substr(next.length);
                        $(self).html(content+next);
                        setTimeout(function(){
                                typeone(self, text, content+next);
                        }, opt['delay']);
                        if(text.length==0) if (callback!=null) callback();
                }
        }
        this.each(function() {
                opt = opt || { 'delay': 65 };
                typeone(this, $(this).html(), '');
        });
        return this;
}

Un simple fonction qui simule le fait de taper à la machine.

Mais voila, je fais des tests, et pour ces tests, j'aimerai stopper une fonction en cours et la relancer avec de nouveaux paramètres.
Ma question est donc :
Savez vous comment stopper l'exécution d'une fonction en javascript ou Jquery et ce de manière récursive au cas ou cette fonction en contiendrai d'autres ?

Mes tests actuel :

- Jquery .stop, mais c'est fait pour les animations, pas pour les fonctions il me semble.
- J'imbrique une nouvelle fonction au début qui va vérifier si un autre appel à cette fonction à fait apparaitre la div dans laquelle la fonction typewriter est occupé "d'écrire". Et si la div existe, elle la fait disparaitre. C'est un peu truander ;) Je préfèrerai savoir si un stop function ou qch comme cela existe ;)
Voir mon projet sur jeux-web
Accès direct à Damocorp Space War
La fiche de Damocorp sur jeux-web

Hors ligne Prelude

  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 1155
  • Karma: +9/-0
    • Mon blog
Re : Javascript ou Jquery : stopper l'execution en cours d'une fonction
« Réponse #1 le: 24 août 2012 à 14:04:37 »
Pas de "stop function" à ma connaissance.

Par contre, tu peux mettre une variable globale à TRUE et vérifier son état au début de ta fonction : si elle est à FALSE, tu fais un return, sinon tu continue.
Et cela est du coup valable pour les autre fonctions imbriquées.

Là, comme ça, je ne vois pas d'autres solutions.

Quoiqu'il en soit, il est préférable de faire un setTimeOut sous conditions, et la condition peut justement être cette globale.

Hors ligne Damocorp

  • Membre Junior
  • **
  • Messages: 93
  • Karma: +0/-0
    • Damocorp Space War
Re : Javascript ou Jquery : stopper l'execution en cours d'une fonction
« Réponse #2 le: 24 août 2012 à 14:49:31 »
C'est embêtant ;-)
C'est pourtant un truc qui serait bien utile ;D

Bon finalement, il est vrai que mon problème proviens de la conception, je n'avais pas prévu d'utiliser cette fonction à cet effet. Mais bon ;)

l'idée de la variable en global était sympa, je l'ai testé mais ça m'emmerdait car j'avais trouver plus simple mais loin d'être professionnel et performant. Il n'empêche que je retient l'idée pour mes futur Setimeout, ça devrai m'éviter de futur soucis. Donc, finalement après réflexion et avoir imaginer le cas dans un job j'ai trouvé une solution :

- Ton collègue raconte une blague ( mon évènement aléatoire )
- Ton patron débarque avec un message ( mon message important )
La solution est pourtant simple, si tu peux pas t'empêcher de raconter ta blague, mieux vaut disparaître pour ne pas t'attirer les foudres de ton patron qui lui à un message important !

Oui je sais, c'est tiré par les cheveux, mais bon :) C'était marrant à imaginer et cela m'as donné la solution.

- Donc je supprime grâce à remove mon div global ( je vire mon collègue avec sa blague pourri  ;D )
- Je crée une nouvelle div pour déclencher à nouveau la fonction à qui je passe les nouveaux paramètres id pour modifier la bonne div. ( je sort mon bloc note prêt à choper l'information importante )

Ainsi tout marche nickel ! Mon pote fini sa blague tout seul dans son coin avec personne pour le voir ni l'entendre.
Et moi je voit et j'entend les informations sérieuses ;)


- Étonnement ma fonction continue dans une div qui n'existe plus mais cela ne semble pas la déranger  ;D
- C'est très peu sérieux, et surtout loin de l'optimisation. Mais on parle de messages très court ( 1 phrase de max 10-15 mots ) qui plus est n'est pas censé être afficher !
Car aujourd'hui rappeler qu'un email ça n'existe pas sans @ et extension, c'est quand même grave  :-\


Et pour mon délire, je vous rassure ! Ça se soigne pas ! haha !  ;D
Voir mon projet sur jeux-web
Accès direct à Damocorp Space War
La fiche de Damocorp sur jeux-web

Hors ligne Prelude

  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 1155
  • Karma: +9/-0
    • Mon blog
Re : Javascript ou Jquery : stopper l'execution en cours d'une fonction
« Réponse #3 le: 24 août 2012 à 14:58:38 »
Citer
Ainsi tout marche nickel ! Mon pote fini sa blague tout seul dans son coin avec personne pour le voir ni l'entendre.

Pas bien !
Il est préférable d'éviter ce genre de choses, question de performance.

Hors ligne Damocorp

  • Membre Junior
  • **
  • Messages: 93
  • Karma: +0/-0
    • Damocorp Space War
Re : Javascript ou Jquery : stopper l'execution en cours d'une fonction
« Réponse #4 le: 24 août 2012 à 15:08:02 »
Je vais changer cela, mais en attendant, pour mes tests ça suffira.
Puis les performances pour un site personnel destiné à max 30-40 personnes ( en privé, non accesible aux monde du web ), c'est pas mon but premier. Mais il est clair que lorsque je vais adapter ce test d'idée à Damocorp, je vais la retravailler :)
Voir mon projet sur jeux-web
Accès direct à Damocorp Space War
La fiche de Damocorp sur jeux-web

Hors ligne Damocorp

  • Membre Junior
  • **
  • Messages: 93
  • Karma: +0/-0
    • Damocorp Space War
Re : Javascript ou Jquery : stopper l'execution en cours d'une fonction
« Réponse #5 le: 24 août 2012 à 20:02:33 »
Citer
Pas bien !
Il est préférable d'éviter ce genre de choses, question de performance.

Finalement, y'a pas que niveau performance.

Cette fonction était sympa, et je me suis demandé pourquoi ne pas l'utiliser quand je le souhaite. Seulement voila, une fonction prévu pour 1 appel, traficoter pour un 2e appel simultané qu'on souhaite pouvoir appeler n'importe quand, ça deviens vite le bordel. Surtout contre un serial cliqueur comme moi.

Voici donc le nouveau code, optimisé et orienté par Prélude  :P

// Variable globale qui va nous permettre de stoper ou non la fonction
var stop_function = 0;
// Variable global pour casser le Timeout en cas de stop function
var timer_typewriter;

// Fonction machine à écrire, source fonction :
// http://www.jquery.info/spip.php?article19
$.fn.typewriter = function(id,opt,callback) {
   
    var sav_text = $(this).html();
   
    $(id).css("display","block");
    var i=0;
    var typeone = function(self, text, content) {
        if (text.length > 0) {
            i=i+1;
            var next = text.match(/(\s*(<[^>]*>)?)*(&.*?;|.?)/)[0];
            text = text.substr(next.length);
            $(self).html(content+next);
            if ( stop_function == 0 ){
                timer_typewriter = setTimeout(function(){
                        typeone(self, text, content+next);
                }, opt['delay']);
             }
             
            if(text.length==0) if (callback!=null) callback();
        }
    }
    this.each(function() {
        opt = opt || { 'delay': 65 };
        typeone(this, $(this).html(), '');
    });
    return this;
}

// Finallement le casse fonction
function stopper_la_fonction(){
    stop_function=1;
    clearTimeout(ma_fonction_aleatoire);
    clearTimeout(timer_typewriter);
}

Comment ca marche ?
J'ai des fonctions qui envoient du texte à la fonction typewriter ( imaginons XXXX pour la nommé ).
Pour m'assurer d'éviter deux lancement simultanés, je lance stopper_la_fonction au tuot début de la fonctionXXXX  . Celle-ci en attribuant 1 à stop_function casse la boucle dans typewriter et clearTimeout désactive le settimeout.

Ensuite, dans ma fonction XXXX J'ai juste rajouter un stop_function=0; juste avant l'appel à typewriter. Celui-ci me permet ainsi de ré-autoriser la boucle.


Avec ta méthode prélude, c'est optimisé, plus besoin de supprimer les div ou d'en créer en laissant tourner des fonctions fantôme en arrière plan.
Et le pire c'est que ça prend moins de ligne de code que mes autres fonctions tout en étant appelable non stop.
Puis j'aurai plus qu'a copier coller pour Damocorp :)

he ben comme cela, j'irai encore dormir moins con tiens ;)
Voir mon projet sur jeux-web
Accès direct à Damocorp Space War
La fiche de Damocorp sur jeux-web