[Php-it] [JS] simulare lo sleep.

Davide Michel 'ZioBudda' Morelli michel at ziobudda.net
Thu Dec 28 14:14:16 CET 2006


Cristiano Verondini ha scritto:
>
>>
>> Lo so anche io che non si fa mai, se utilizzassi una varibile locale,
>> ma miaglobal è una variabile global quindi nel mentre del while() il
>> suo stato potrebbe anche cambiare (la funzione richiamata da setTimeout
>> dovrebbe avere questo scopo). Ripeto che setTimeout esegue la funzione
>> che passi come primo parametro solo dopo il numero di millesecondi che
>> passi come secondo parametro non è che si ferma ad aspettare il
>> timeout, quindi l'unico modo per far attendere i l browser è quello
>> di fare una azione ripetitiva subito dopo setTimeout fino a quando
>> una qualche cosa non blocca questa azione; ecco il perche' dell'uso 
>> di una variabile
>> globale.
>
>    Ho compreso la logica, ma che succede se per qualche motivo, 
> qualsiasi motivo, quella variabile non cambia stato?

Non puo' non cambiare a meno che il setTimeout si dimentichi di chiamare 
la funzione che deve chiamare :) Non generalizziamo su ogni caso 
possibile, restiamo nel contesto del mio esempio con quel codice scritto.

>
>> Potrà anche essere quello corretto, ma la prima istruzione dopo
>> setTimeout deve essere quella che simula il tempo che passa senza fare
>> nulla.
>
>    No, continui a pensare in modo procedurale, non in modo asincrono.

Ma non centra procedurale o asincrono è pura logica di funzionamento. Se 
non ho una funzione bloccante, ma che richiama solamente una 
funzione-terza dopo un tot di tempo, allora la prima istruzione dopo la 
funzione-non-bloccante deve essere un qualche cosa che mi fermi 
l'esecuzione dello script.

>> Qui non si tratta di ajax. si tratta di far passare del tempo tra due
>> azioni.
>
>    Due funzioni. La prima chiama settimeout() con l'intervallo e il 
> nome della seconda, la seconda viene chiamata allo scadere del tempo. 
> Non c'è altro modo.
Azioni o funzioni non cambia. Tra settimeout() e chiamata a 
funzione-terza fatta da settimeout() non devono essere effettuate 
operazioni di nessun tipo. Visto che settimeout() non è bloccante devi 
simulare il non eseguire operazioni.

>    Ma al giorno d'oggi c'è ancora qualcuno che usa cicli di polling 
> attivo? Ripeto, non è questo il modo.

Tralasciando che il mio era solo una prova se questo non è il modo me ne 
dici uno tu. Ma che sia funzionante. Non solo a parole.

>
>> Non è un while(true) ma un while(varibiale_globale = true) quindi se
>> cambio valore alla variabile globale lui deve uscire dal while. Visto
>> che non lo fa, mi sorge il dubbio che il valore della
>> variabile_globale sia salvato da qualche parte all'interno del while 
>> e che quindi non
>> venga piu' confrontanto con quello attuale (che nel fratttempo
>> potrebbe essere cambiato).
>
>    Improbabile, a meno che tu non usi delle closure. Più probabile, il 
> valore non viene per niente cambiato a causa di un qualche errore di 
> logica, di recupero di dati o altro. Userei un debugger JS per capirlo.

Il valore non viene cambiato. Riprendiamo l'esempio ?

var miaglobal;
function ferma()
{
   miaglobal = true;
   timerid = setTimeout("riprendi(timerid)",500);
   while (miaglobal == true) tmp = '';
   }

function riprendi(timer) {
   miaglobal = false;
}

Se mi indichi dove è l'errore mi fai un grandissimo piacere, perche' io 
non riesco proprio a vederlo. Praticamente, a quando posso capire, il 
while() blocca tutto; anche l'esecuzione di setTimeout();

>
>    Allora io penserei ad un modo *diverso* per farlo! :)

L'avevo anche trovato (vedi prima email), ma non funziona come dovrebbe.

Michel.

-- 
Michel 'ZioBudda' Morelli                       michel at ziobudda.net
Consulenza sistemistica in ambito OpenSource.
Sviluppo applicazioni web dinamiche (LAMP+Ajax)
Telefono: +39-0240706096 --  Fax: +39-0291390660

http://www.ziobudda.net                         ICQ: 58351764  
http://www.ziobuddalabs.it                      Skype: zio_budda
http://www.ajaxblog.it                           



More information about the Php-it mailing list