Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074

    [JQuery] callback: soluzione migliore?

    Ho una funzione, molto articolata, che viene eseguita all'azione dell'utente.
    La funzione contiene al suo interno sia istruzioni per cambiare il setting css di alcuni elementi, sia la chiamata ad ulteriori funzioni esterne. Insomma, qualcosa tipo:
    codice:
    function myFunction() {
    $("#myelement").css({"left": "100px"});
    if (a == 0) {
    mySecondFunction();
    } else {
    myThirdFunction();
    }
    /* etc etc... */
    }
    Quello che mi occorre, è una chiamata callback che venga eseguita quando l'intera sequenza delle istruzioni contenute sia stata completamente eseguita.
    Deve, cioè, scattare solo e soltanto quando l'esecuzione di ogni singola funzione, richiamata all'interno della funzione principale, sia terminata.
    Qual'è la migliore soluzione per ottenere questo risultato?
    metatad
    graphic & web design

  2. #2
    Le istruzioni nella tua funzione vengono tutte eseguite in maniera sincrona, a meno che non hai qualche chiamata ajax nella funzione principale o in qualche altra funzione richiamata dalla funzione principale.

    Anche il metodo animate() di jQuery funziona in maniera asincrona (come le chiamate ajax), nel senso che lo script non attende il completamento dell'animazione per proseguire l'esecuzione.

    Questo vuol dire che, se non hai chiamate ajax e non usi istruzione asincrone, l'ultima istruzione della funzione verrà eseguita dopo che tutto il resto è stato già eseguito.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074
    No, non ci sono chiamate Ajax, né viene usato il metodo animate. Però ci sono varie azioni di movimento e di zoom, comandate via css, che hanno un tempo di esecuzione. Tempo che, ovviamente, è in qualche misura variabile anche in base alla macchina su cui viene eseguita la funzione.
    metatad
    graphic & web design

  4. #4
    Quindi un'istruzione posta alla fine della funzione principale viene eseguita "troppo presto"?

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074
    Non esattamente... il problema è che la funzione viene utilizzata in un interfaccia in cui l'interazione utente avviene tramite un sensore di movimento. Ed a volte accade che il sensore registri un movimento come un ulteriore input, richiamando la funzione prima che questa abbia completato il suo ciclo.
    Pensavo quindi di utilizzare un variabile booleana. Se quando la funzione viene chiamata questa ha valore on, la funzione viene eseguita (e come prima cosa, imposta la variabile su off), quindi al termine tramite callback viene reimpostata su on.
    Ho già provato ad ottenere questo risultato, in realtà, utilizzando un setTimeout al termine della funzione, ma il problema non si è risolto. Mi sta venendo il dubbio che il problema sia altrove, nel ciclo loop che verifica gli input provenienti dal sensore... probabilmente è lì che viene conservata l'informazione sull'input, e quando la condizione prevista si ri-verifica parte la nuova chiamata alla funzione.
    metatad
    graphic & web design

  6. #6
    L'idea di usare una variabile booleana è buona, non capisco cosa c'entri il setTimeout con questo approccio.

    Dovresti impostare la variabile booleana nello scope globale e, nella funzione principale, gestirne gli stati.


    Esempio:

    codice:
    <script>
    var running=false;
    
    function main_function(){
       running=true;
    
       //istruzioni
    
       running=false;
    }
    
    $('#input').on('input',function(){
        if(!running){
            main_function();
        }
    });
    </script>

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 © 2025 vBulletin Solutions, Inc. All rights reserved.