le code qui fait mal aux yeux du jour
Par gblanc le mercredi, décembre 2 2009, 11:56 - informatique - Lien permanent
J'en reste sur le postérieur : il n'y a pas de fonction sleep en Javascript (gare à celui qui me demande ce que je fiche avec un truc pareil !). En cherchant sur le net, on trouve des solutions de callback scabreuse, et une vieille méthode, qui comment dire, bref...
function sleep(time){
var start = date.getTime();
while(start+time > date.getTime()) true;
return;
}
J'espère que vous ne venez pas de manger. Ça ferait presque penser aux vieux temps du nop en asm pour occuper le CPU. On est en 2009, un langage de programmation ne propose pas de moyen de faire une pause autre que d'occuper 100% des ressources du CPU en attente active ; après demande aux webeux linagoriens, incrédule, confirmation a été donnée. Tout à coup, une citation de Linus Torvalds m'est revenue :
Modern PCs are horrible. ACPI is a complete design disaster in every way. But we're kind of stuck with it. If any Intel people are listening to this and you had anything to do with ACPI, shoot yourself now, before you reproduce.
J'en pense de même pour les créateurs du Javascript...
Commentaires
Le problème ici ne concerne pas les créateurs de Javascript, mais les utilisateurs qui ici utilisent du busy waiting.
D'autres très beaux langages comme Erlang ne disposent pas d'une fonction "sleep" non plus. L'idiome consiste à attendre un message qui ne peut pas arriver avec un timeout positionné sur le délai qui nous intéresse.
En Javascript, il suffit, si on a *vraiment* besoin d'attendre un temps donné, d'utiliser les fonctions de synchronisation idoines et les fonctionalités de gestion du temps comme les alarmes. C'est tout aussi propre que "sleep" et peut souvent révéler qu'en fait il n'y en a pas du tout besoin.
Je vais demander un DIF Erlang, on m'en parle tellement... :p
Bref, on aura deviné que si j'avais besoin de ça, c'est que je suis en train de faire du crasseux pour passer outre des bugs, qui sont induits... par un langage crasseux... Et je ne t'explique même pas l'idée de substitution pour résoudre le problème, elle est pire encore (n'empêche que pour le moment : bug IE non résolu, client pas content). Mais faire une tempo dans un langage de prog graphique, je ne vois pas le problème : la prog par callback au timeout, ça rappelle fortement Motif, et ses fabuleuses boucles de procédures faisant des callbacks sur elles-mêmes (oh, sans tenir compte du délai d'exécution, que j'avais en plus, miam les désynchros...). Comment fait-on clignoter simplement une LED en JS ? :D (puisque je faisais du GPIO jeudi dernier en Python ; ça au moins, je connais...).
Faire clignoter une led ? Je ne m'étais jamais posé la question, mais c'est trivial : http://paste.factorcode.org/paste?i...
Note la capture de "led" et "on" dans la closure du premier argument de setInterval(). Je ne trouve pas le code particulièrement inélégant. Même si je ne pratique que très rarement le Javascript, je pense que c'est un plutôt beau langage.
:)
Pointeur de fonction, quand tu nous tiens...