Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683

    rentere setInterval meno asincrono

    Ciao a tutti!
    ho un problema con setInterval...
    Praticamente ho una funzione che restituisce un dato fondamentale per setInterval, solo che questa funzione per essere completata richiede parecchio tempo, intanto setInterval parte e non trova il dato che gli serve, quindi esce (credo perchè sia asincrono dal resto!)
    Volevo sapere se c'era un modo per dire, attendi che una certa variabile venga settata prima di partire con il setInterval
    codice:
    var controllo=0
    controllo=funzione_lunnghissima();
    var animazione=setInterval(function(){
          if(controllo==1){/*codice*/}
    })

  2. #2
    Essendo javascript procedurale, a regola il setInterval non dovrebbe partire prima che le istruzioni che lo antecedono non siano (se sincrone) tutte espletate.

    Ad ogni modo setInterval parte quando gli dici di partire, cioè appena lo invochi.
    Se per un qualche motivo l'ordine procedurale è ancora in corso mentre setInterval parte, il problema è facilmente aggirabile: lasci che setInterval parta, ma ci metti dentro una espressione condizionale che verifichi che il dato che vuoi esista e, se non esiste, ci metti return false.

    A questo modo setInterval parte, sì, ma all' atto pratico non fa nulla finchè la variabile che vuoi non ha il valore che vuoi.

    Nel tuo esempio ad ogni modo devi essere sicuro che funzionelunghissima restituisca davvero (return) 1 come numero affinchè
    if(controllo==1){/*codice*/}
    else{return;};

    Insomma, non vedo il problema in realtà, a meno che tu non voglia spiegarlo meglio nel caso questa risposta non ti soddisfi.

  3. #3
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    fai dei settimeout finché la variabile ha il valore che ti aspetti, poi continui l'esecuzione
    oppure usi i deferred object di jquery per controllare lo stato delle esecuzioni asincrone
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  4. #4
    Originariamente inviato da fcaldera
    fai dei settimeout finché la variabile ha il valore che ti aspetti, poi continui l'esecuzione
    oppure usi i deferred object di jquery per controllare lo stato delle esecuzioni asincrone
    il settimeout si esegue una volta sola. Se i dati non esistono quando il settimeout è eseguito, ricade nel solito problema. A quel punto deve fare un altro settimeout, e cosa è a tal punto una sequenza di settimeout se non che un setInterval unico? Cioè, setInterval nasce in javascript in un secondo momento (o quantomeno i testi iniziarono a riportarlo in un secondo momento) proprio per dare la possibilità di effettuare settimeout _ricorsivi_ impuiegando un metodo nativo.

    Dovrebbe specificare meglio che tipo di problema incontea, perchè in realtà il codice che ha postato va bene: il setInterval parte e controlla ogni x tempo che la variabile controlla sia == 1, e finchè non lo è non esegue il codice fra graffe.

    Insomma, non si capisce bene perchè questa cosa non lo soddisfi: o non abbiamo abbastanza dati riguardo al problema che incontra (che forse è in realtà di natura diversa da come se lo rappresenta adesso), o la funzione funzione_lunghissima non ha un return 1 per cui non gli esegue mai il codice del setInterval - boh non so, non si capisce bene.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    Originariamente inviato da TrueLies
    Insomma, non vedo il problema in realtà, a meno che tu non voglia spiegarlo meglio nel caso questa risposta non ti soddisfi.
    Adesso provo ma son certo vada bene! ho fatto questa domanda perchè prima di usare dei "rimedi" mi piace chiedere (senza influenzare con i miei metodi) qual'è secondo voi il miglior modo di procedere... perchè se parte il setInterval comunque ci sarà un nuovo ciclo, che sarà inutile per un periodo, e non so quanto possa occupare in termini di risorse, magari per computer più datati e non... però se TrueLies dice che è meglio far così mi fido ciecamente! su questo forum nessuno ne sa più di lui sui setInterval e setTimeout, o per lo meno, lui mi risponde sempre a queste domande

    Originariamente inviato da fcaldera
    fai dei settimeout finché la variabile ha il valore che ti aspetti, poi continui l'esecuzione
    oppure usi i deferred object di jquery per controllare lo stato delle esecuzioni asincrone
    deferred object di jquery???? questo già mi piace molto, vado subito ad informarmi!

    Grazie mille

  6. #6
    Beh ora mi preoccupo: ma questa funzione_lunghissima quanto dura? E se tutto è inutile finchè le sue operazioni non si sono concluse, vabbè avvia il setInterval da dentro la funzione lunghissima stessa.

    var foo;
    function funzionelunghissima(){
    //bla bla bla per tante volte
    if(bla bla bla){foo=setInterval(bla bla bla)}
    }

    ps non ti fidare ciecamente di nessuno - siamo tutti soggetti a errori e, ancor più frequentemente, a fraintesi, magari dovuti a informazioni incomplete 8cosa frequentissima sui forum)
    facci sapere se hai trovato la soluzione che cerchi - o altrimenti spiegaci meglio cosa fa sta funzione lunghissima ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    no no va bene la risposta che mi hai dato... ma invece... questo è un dubbio che non centra con quel che sto facendo, ma potrebbe capitare...
    se io, facciamo un esempio, con il click del mouse sopra a qualcosa richiamassi:
    funzione_lunghissima() e setInterval (sempre dipendente dal risultato di funzione_lunghissima)
    un pò come l'esempio precedente, con la differenza che il clearInterval è richiamato con il rilascio del mouse...
    cosa succederebbe se la funzione lunghissima durasse qualche secondo? che quindi, il click del mouse e il successivo rilascio avvenissero prima della risoluzione della funzione? il setInterval verrebbe cancellato (con clearInterval) ancora prima di partire? quindi non andrebbe? e come si potrebbe risolvere?

  8. #8
    A regola in un linguaggio di scripting che è procedurale, non parte nulla finchè la funzione lunghissima, se è stata invocata per prima dentro l'evento, non ha finito.

    Comunque puoi fare dei test tu stesso usando proprio questa funzione lunghissima dentro degli onmousedown e onmouseup.

    Come ti dicevo non mi è ben chiaro cosa è che succede nel tuo script - la mia impressione è che il problema sia da qualche altra parte ma non conoscendo i codici non saprei.
    ciau

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.