Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    miglioramento codice javascript

    Ho un oggetto activeX referenziato con la variabile map.

    Se volessi lanciare il suo evento map.zoomScale, per non incorrere in errore devo prima verificare se una proprietà, Busy, è vera o falsa.

    Ho pensato di ricorrere a setTimeout per rilanciare la funzione, e funziona.

    Voglio però che setTimeout funzioni al massimo per 10 volte.
    Per fare questo ho utilizzato una variabile contatore n, all'esterno della funzione.

    Chiedo se non si possa migliorare facendo a meno di variabili esterne e demandando tutto alla funzione.

    Ecco il mio codice:
    codice:
    var n = 0;
    function _zoomScale(lat, lon, scale)
    {
    	
    	n++;
    	if(n > 10) {alert("troppe iterazioni"); return;}
    	if(map.Busy) window.setTimeout(function(){_zoomScale(lat, lon, scale)}, 1);
    	else {map.zoomScale(lat, lon, scale);alert(n);n=0;}
    }
    e la richiamo con:
    _zoomScale(lat, lon, scale);

    Pietro

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    No.
    JS e` un linguaggio interpretato. Significa che viene letto ed eseguito subito.

    Una funzione (e le sue variabili) esistono solo mentre viene eseguita, mentre vengono perse subito dopo.

    Quindi hai mecessita` di una variabile globale, e questa e` creata mediante un var fuori dalla funzione.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ho optato per l'aggiunta dell parametro n
    codice:
    //----------------------------------------------------------------
    // lancia il metodo map.zoomScale(lat, lon, scale) quando la mappa
    // non è impegnata
    //----------------------------------------------------------------
    function _zoomScale(n, lat, lon, scale)
    {
    	if(n > 10) {alert("troppe iterazioni in _zoomScale"); return;}
    	if(map.Busy) {n++; window.setTimeout(function(){_zoomScale(n, lat, lon, scale)}, 250)};
    	else {map.zoomScale(lat, lon, scale);/*alert(n);*/}
    }
    e la richiamo con:
    _zoomScale(0, lat, lon, scale);

    Sembra che funzioni, nel senso che vedo, con alert(n), il numero di volte che lancio la funzione.

    Pietro

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    chiedo ancora un parere:

    dato che l'oggetto map ha diversi metodi che, per funzionare debbono controllare la proprietà booleana Busy, ho provato a fare una funzione generale del tipo:

    codice:
    function lancia_metodo_timeout(n, stringa_funzione)
    {
    	if(n > 10) {alert("troppe iterazioni in " + stringa_funzione); return;}
    	if(map.Busy) {n++; window.setTimeout(function(){lancia_metodo_timeout(n, stringa_funzione)}, 250)};
    	else { eval(stringa_funzione); /*alert(n);*/}
    }
    ossia, per esempio, al posto di richiamare:
    codice:
    map.zoomScale(lat, lon, scale);
    chiamo:
    codice:
    lancia_metodo_timeout(0, "map.zoomScale(" + lat + ", " + lon + ", " + scale + ")"  );
    cosa ne pensi? :master:
    Pietro

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Potrebbe anche funzionare, ma la funzione eval() e` deprecata, e potrebbe non funzionare in qualche browser presente o futuro.

    Non e` fattibile una funzione per ogni metodo?
    Tipo quella che hai gia` fatto, oppure:
    codice:
    function _zoomScale(lat, lon, scale, n) {
      if(n == undefined) n=10;
      if(--n <= 0) {alert("troppe iterazioni in _zoomScale"); return;}
      if(map.Busy) {
         window.setTimeout(function(){_zoomScale(lat, lon, scale, n)}, 250)};
      else {map.zoomScale(lat, lon, scale);/*alert(n);*/}
    }
    Nota che con questa variante, nella prima chiamata non devi specificare n.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Dunque, mi hai proposto una cosa interessante.
    In pratica simulo un parametro opzionale n, che, chiaramente deve essere messo alla fine.

    Per l'altra cosa, una funzione wrapper per ogni metodo critico, era la prima strada scelta e, dopo un po' di prove, mi pare che sia la migliore.

    Comunque, ho come la sensazione che la cosa sia interessante anche in altri contesti

    Ciao
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.