11548 sujets

JavaScript, DOM et API Web HTML5

J'ai une question un peu coupage de cheveux en quatre je l'admets mais la réponse est importante quant au mode de programmation.
J'ai googlé pas mal sur le sujet pour me rendre compte qu'il existe à peu près autant d'interprétations sur le mode de fonctionnement de la méthode setTimeout que de réponses google à ma query...

De fait :

La méthode setTimeout :

1/ Est-elle une fonction qui rend la main après avoir armé un timer, auquel cas l'exécution de la fonction continue alors que le timer décompte.

Ou alors

2/ N'est elle qu'un wait qui décompte patiemment le temps avant d'exécuter la fonction. C'est à dire ne rendant pas la main avant l'écoulement du temps.

Ce problème me préoccupe car si la fonction à déclancher à l'issue du timeout est la fonction dans laquelle la méthode setTimeout se situe, alors dans le second cas, il faut prendre les mesures appropriées à l'écriture d'une fonction réentrante.
On retrouve cette même problématique si on est dans le cas 1 et que la valeur donnée en timeout est inférieure au temps nécessaire pour exécuter les instructions séparant la méthode setTimeout et la fin de la fonction.

Bon ! J'espère avoir été clair. Quand bien même j'ai moi-même un peu de mal à me relire, mais je suis sûr que quiconque à travaillé avec cette méthode comprendra ce qui me préoccupe.

Bon Dimanche à tous.
Modifié par aCOSwt (09 Oct 2006 - 09:17)
aCOSwt a écrit :

1/ Est-elle une fonction qui rend la main après avoir armé un timer, auquel cas l'exécution de la fonction continue alors que le timer décompte.

Ou alors

2/ N'est elle qu'un wait qui décompte patiemment le temps avant d'exécuter la fonction. C'est à dire ne rendant pas la main avant l'écoulement du temps.

Personnellement, je tape 1.
Après avoir défini un timer, le script continue immédiatement à l'instruction suivante tout en commençant à décompter parralèlement.
En javascript, il n'existe pas de fonction tel wait ou sleep qui effectue une opération comme tu la décris en n°2.

aCOSwt a écrit :

On retrouve cette même problématique si on est dans le cas 1 et que la valeur donnée en timeout est inférieure au temps nécessaire pour exécuter les instructions séparant la méthode setTimeout et la fin de la fonction.

Alors là il faut vraiment être très fort.
En général, les scripts javascript sont tellement en basse priorité qu'un temps de 1 ou 2 ms n'est jamais respecté. J'avais fait le test, 10000 fois 1 ms ne donne pas un temps d'exécution total de 10 secondes mais au moins 50, 60 voire 70 secondes.
ET si tu me trouves une fonction qui dure plus de 5-10 ms en ne faisant pas exprès (pas un for i=0; i < 10000000 hein) je suis preneur juste pour voir...


Pendant que je parle de setTimeout, voici un petit truc à savoir qui n'est pas forcément expliqué partout : on peut passer un pointeur de fonction plutôt qu'une chaîne en paramètre, cela rend parfois bien service.

Exemple, à la place de :
setTimeout("maFonction();", 200);
ON peut remplacer par :
setTimeout(maFonction, 200);
Firefox permet même de passer des arguments de la manière suivante (attention, pas compatible IE mais ça doit pouvoir s'arranger avec un patch que j'écrirai peut-être si ça n'existe pas déjà et si j'en ai le temps) :
setTimeout(maFonction, 200, arg1, arg2, arg3, ...);

Voilà et bon dimanche à toi aussi.

EDIT : Ah oui j'oubliais. S'il s'agit de faire ce type de traitement :

function maFonction () {
// instructions
setTimeout(maFonction, 200);
}


Tu auras avantage à utiliser setInterval :

function maFonction () {
// traitement
}
setInterval(maFonction, 200);

Modifié par QuentinC (08 Oct 2006 - 12:43)
Waou ! Ca c'est de la réponse ! Merci à toi QuentinC

Grâce à toi j'ai enfin pu mettre un point final à cette histoire.

... off topic pour ce qui est du script qui dure... oh... ce n'était qu'une folie de la part d'un autre... fou d'info... j'ai un jour tenté d'adapter un programme fortran de FFT (F comme... Fast ???...) en Javascript... Je reconnais que cela vaut un for i = 1 to 100000000 !!!!...
Et j'ai fini... par me débrouiller autrement...

Merci encore pour tes lumières !