Programmazione dei ritardi in Javascript: setTimeout(comando,tempo);

Spesso si ha l’esigenza di ritardare in uno o più punti ben precisi il flusso dell’esecuzione del programma, (per evidenziare una scritta, o sentire una sequenza di messaggi, o ripetere una funzione ogni tot secondi.

Sniffando In giro per la rete, ci si persuade a denti stretti che l’istruzione setTimeout non può andare dentro un ciclo ripetuto for(…) {….; setTimeout(‘comando;’,tempo); …}

si giunge a questa desolante conclusione perchè i più si limitano a indicare che “tempo” è il numero di millisecondi di ritardo, ma non si dice altro!

La confusione aumenta quando si prende coscienza che nell’ambiente HTML e suoi eredi, che ospitano Javascript, esistono varie gestioni dei tempi, ognuna retta dalla gestione degli eventi! Eventi del tipo <input> per acquisizione di dati da tastiera,che ruotano all’infinito ad una certa velocità che è la massima consentita.

Gli eventi di inizio esecuzione di un programma javascript avvengono al di fuori del controllo degli eventi HTML, salvo adottare tecniche AJAX, invocando comandi asincroni.

Nel caso in esame, se volessi creare un ciclo del tipo:

for(i=0;i<=100;i++)  {setTimeout(‘prova();’ , 4000) }

// con:

function prova(){

…..

};

altro non otterrei che un gran pasticcio!! La funzione prova() verrebbe eseguita 100 volte dopo 4 secondi! E per eseguirla 100 volte, occorre tra l’altro un tempo-macchina apriori indeterminato!

La soluzione allora è quella di scrivere 100 volte il comando prova();

Questa soluzione ovviamente risulta  assurda.

Come fare allora?

Ecco che occorre capire la ratio e la genesi del comando javascript, prima di utilizzarlo alla cieca, anche se esso non è assolutamente ben illustrato!

il ciclo funzionerà perfettamente se la variabile tempo viene considerata come una dimensione continua, che parte all’istante t0, e ogni frazione Dt, ripeta il comando.

Ecco allora finalmente la soluzione:

var Dt=4000;t=0;

 

for(i=0;i<=100;i++)  {

                               t+=Dt;  //  !!!!

setTimeout(‘prova();’ , t)

}

Sarebbe bastato che qualcuno, prima di me, comprendesse l’esatto significato del parametro t, che non è una durata! Esso è un valore t lungo l’ascissa temporale di tutto il fenomeno considerato!

Ecco una bella poesia per una bambina polacca di 10 mesi:

25 versi della durata ciascuno di 3 secondi! ogni verso blocca il flusso, per il tempo stretto che venga riprodotto a voce, e poi si passa al successivo.

Diversamente verrebbero recitati tutti in una volta i 25 versi, o meglio l’interprete comprenderebbe questa intenzione, ma non sarebbe in grado di eseguirli in sincronia!

Risultato: si blocca  la cache e tutta la pagina del browser ospite!

 

http://www.renatocappellani.altervista.org/lauritka.html

Contra factum non valet argumentum!

Chiaro come la neve no? niente chiacchiere ma la coscienza di non aver capito prima un bel nulla.