[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