Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    194

    richiamo di una funzione con ciclo setInterval all'interno

    Mi aggancio all'altra mia discussione (variabili globali dalla risposta Ajax). Andando avanti con lo script mi sono reso conto di un problema che sicuramente è alla base di quanto accadeva.
    In pratica sto richiamando una funzione nella quale c'è un ciclo con setInterval.
    Quando richiamo nuovamente la funzione questa va ad aggiungersi alla precedente tant'è che il conteggio impazzisce. Non ne avevo idea. Come posso fare per terminare la precedente istanza senza il refresh? Ho provato con clearInterval e clearTimeout, bloccano il conteggio ma non terminano la funzione.

    codice:
    funzione Attributi(){
    //chiamata Ajax
    //operazione con i dati
    var conteggio = setInterval(function(){
    
    //conteggio a schermo
    
    }, 1000);
    
    // chiamata Ajax che decide o meno il riavvio della funzione Attributi
    var RefreshCheck = setInterval(function(){
     $.ajax({
     type: "POST",
     url: "db/refresh_check.php",
     data: "id_eroe="+id_eroe,
     dataType: "html",
     success: function(data){
      if(data == 1){
       Attributi();
      }
     },
      error: function(){alert("Chiamata fallita!!!");}
        });
    
    
    }, 2000);
    
    
    } Attributi();

  2. #2
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    A) non mi sono letto tutta la discussione precedente.
    B) non conosco lo scopo né la logica
    Il primo pensiero è stato il setIterval devi metterlo al callback della funzione.
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    194
    Mi sono avvicinato da poco a JS e sto facendo tutto al solo fine didattico.. io chiedo, ma capisco che interpretare la logica di altri è più difficile che leggere un codice.
    Questo è un esempio spicciolo:

    codice:
    function Myfunction(){
    var conto = 0;
    var conteggio = setInterval(function(){
     conto++;
    }, 1000);
    
    } Myfunction;
    
    
    function Recall()
    {
     clearTimeout(conteggio);
     Myfunction();
    };
    All'avvio della funzione Myfunction il conteggio è 1,2,3,4,ecc..
    Quando richiamo la funzione Recall il conteggio diventa 1,3,5,7,ecc..

    Le mie domande sono:
    Mi confermate quanto accade, ossia che il primo ciclo resta attivo e se ne avvia un secondo in parallelo?
    Se è così c'è un modo per far terminare la funzione Myfunction prima di riavviarla?
    Grazie della pazienza.

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Così come nell'altra tua discussione, devi definire la variabile (o le variabili) sul livello principale in modo che siano rese globali.

    Sono nozioni di base. Se il fine è didattico, forse stai saltando qualche capitolo. Sarà il caso di riprendere da qualche guida di base, non pensi?

    Variabili (JavaScript)
    Ambito della variabile (JavaScript)
    Variabili globali e locali: lo scope

    Per dichiarare (esplicitamente) una variabile sai bene che si utilizza l'istruzione var. Dal momento che hai dichiarato la tua variabile all'interno della funzione, questa è locale, quindi può essere vista solo nell'ambito di quella funzione. Non solo, sarà valida solo fino a quando la funzione stessa non sarà terminata. Il tuo setInterval è valorizzato in una variabile locale, quindi non puoi terminarlo dall'esterno di quella funzione.

    Il fatto che tu richiami la stessa funzione, va a ricreare una nuova variabile locale definendo, di fatto, una nuova istanza per il setInterval. Questo significa che si attiveranno più setInterval contemporaneamente senza mai terminare.

    Chiaramente, come tu stesso già avevi intuito anche sull'altra discussione, e come ti ho indicato qui, un primo passo da fare è quello di definire la variabile (conteggio) a livello globale, e non locale.

    Inoltre setInterval va terminato con clearInterval, mentre setTimeout col relativo clearTimeout. Non è possibile mischiare le due cose come hai cercato di fare.

    Ci sono poi anche altri errori nei codici che hai postato ma per ora sorvoliamo.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    194
    Grazie mille del chiarimento. Mi rimane un dubbio:
    Il fatto che tu richiami la stessa funzione, va a ricreare una nuova variabile locale definendo, di fatto, una nuova istanza per il setInterval. Questo significa che si attiveranno più setInterval contemporaneamente senza mai terminare.
    E' un dato di fatto a prescindere da come definisco la variabile (globale o locale) del setInterval?
    Grazie ancora.
    Ciao

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Scusa ma non ho capito il senso della tua domanda.

    In linea di massima, per ogni chiamata della funzione setInterval() e setTimeout viene restituito un ID incrementale (ed ovviamente univoco) che è possibile utilizzare per terminare il relativo timer attraverso le funzioni clearInterval() e clearTimeout().

    Teoricamente un timer può essere avviato anche senza dichiarare e associargli alcuna variabile, ma semplicemente chiamando la funzione.
    Il fatto di dichiarare una variabile, a cui attribuire il relativo ID di un determinato timer, assicura la possibilità di terminare opportunamente quello specifico timer semplicemente passando tale variabile (cioè il valore ID di quel dato timer) alla funzione clear. Tutto qui.

    Sta quindi a te dichiarare in modo adeguato quella variabile per poterla passare opportunamente al clear. Il fatto di dichiararla localmente (dentro una funzione) o nello scope globale (sul livello principale), devi deciderlo tu in base a quelle che sono le esigenze del caso.

    L'importante, però, è che tu capisca il meccanismo di funzionamento delle variabili e di quelle particolari funzioni che stai usando.


    ...
    Faccio un errata-corrige di quanto ho affermato nel precedente post:
    Inoltre setInterval va terminato con clearInterval, mentre setTimeout col relativo clearTimeout. Non è possibile mischiare le due cose come hai cercato di fare.
    In realtà, per l'interprete JavaScript sulla maggior parte degli attuali browser (se non su tutti), entrambe le funzioni, setInterval e setTimeout, attualmente fanno riferimento ad una stessa funzione principale che inizializza le varie istanze timer in uno stesso elenco. Le due funzioni, clearInterval e clearTimeout, agiscono entrambe su questo stesso elenco, per cui risulta possibile usarle indifferentemente per terminare un qualsiasi timer che sia stato avviato tramite clearInterval o tramite clearTimeout.
    Personalmente, per una questione di pulizia e leggibilità del codice, trovo comunque più adeguato utilizzare le due funzioni in modo corrispettivo.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

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.