Domanda Inserire una pausa all'interno di un ciclo for

Stato
Discussione chiusa ad ulteriori risposte.

blob7

Utente Silver
8 Gennaio 2009
14
2
0
65
Salve ragazzi, sto scrivendo un piccolo script e avrei un problema che non riesco a risolvere.
Ho creato questo ciclo for:
Codice:
var ads = *numero*;

setTimeout(function check()
           {
    for (n=0; n<=ads; n++)
    {
        if ($('#img_'+n).attr("src") == 'blablabla')
        {
// questa funzione deve essere eseguita dopo 'x' secondi
            $('#i'+n).click();
            return;
        }
        else;
    }
}, 1000);
Un altro problema che mi da questo codice è che, impostando un setTimeout all'interno dell'"if" nel caso in cui non sia verificata la condizione dell'"if" attende comunque i secondi impostati come se la condizione fosse verificata.
Come lo risolvo?
 
Il setTimeout che ho scritto è per ritardare la funzione per evitare che sia eseguita appena aperta la pagina, me ne serve un'altra :lol:
 
Intanto, per come sta scritta, tutto quello che sta all'interno verrà sempre e comunque eseguito dopo un tot di tempo.
Questo approccio quindi è da buttare totalmente.

Mi sa tanto che sei vincolato finchè non cambi la logica dell'applicazione. Per come stanno adesso le cose, non puoi fare in modo diverso perchè l'algoritmo deve essere eseguito in quella sequenza.

Puoi piegare meglio cosa stai facendo? Non mi è molto chiaro il contesto
 
Sinteticamente:
Ho alcuni elementi che sono caratterizzati da un id composto da lettere fisse e numeri crescenti, es: id=i1 / id=i2 / id=i3 e via dicendo.
Devo prendere questi elementi dal primo all'ultimo e verificare singolarmente se un altro elemento img_*n*, (sempre appartenente ai primi), con lo stesso indice numerico, abbia un attributo src definito.

Quindi ad esempio all'elemento id=i5, devo verificare se l'elemento img_5 abbia il valore src posto nella condizione if.
Se la condizione è verificata, dopo tot secondi mi deve cliccare sul'elemento i5.
Se la condizione NON è verificata, deve passare all'elemento successivo istantaneamente e ripetere la verifica.

La sequenza in cui devono essere eseguite le operazioni è quella giusta, vorrei solamente ritardare la condizione verificata dall'if.
Il problema è che, se io mettessi un'altra setTimeout alla condizione verificata, per ogni elemento mi effettua la verifica dopo il lasso di tempo della condizione verificata, anche se la condizione non è verificata!
 
Sinteticamente:
Se la condizione è verificata, dopo tot secondi mi deve cliccare sul'elemento i5.
Se la condizione NON è verificata, deve passare all'elemento successivo istantaneamente e ripetere la verifica.

E quindi non ti basta mettere l'altro setTimeout nel corpo dell'if anzicchè fuori?
Dico di fare così:
Codice:
// corretto
if( $('#img_'+n).attr("src") == 'blablabla' ){
    setTimeout( funzione );
}

// errato
setTimeout( function controlla(n){
    if( $('#img_'+n).attr("src") == 'blablabla' ){
         $('#i'+n).click();
         return;
    }
});

Dopo il timeout iniziale, se la condizione è vera allora parte col secondo timeout per cliccare, altrimenti va direttamente all'altro elemento e attende di nuovo il primo timeout e poi controlla di nuovo .
Dovrebbe essere così, no?
 
Ultima modifica:
Teoricamente si, ma in tutte le prove che ho fatto fin'ora non ha mai funzionato :ehm::nuu:

PS: Ho scritto la funzione all'interno dell'if in tutti i modi, la funzione scritta è la seguente:

setTimeout(function (n){
$('#i'+n).click();
}(n), n* 5000);
Così il problema è che mi apre tutte le pagine insieme dopo l'attesa;
Scriverla in quest'altro modo invece:

setTimeout(function (){
$('#i'+n).click();
}(), n* 5000);
da lo stesso risultato di sopra senza attesa;

setTimeout(function (){
$('#i'+n).click();
}, n* 5000);
Così invece apre solo l'ultimo numero, senza attesa;

setTimeout(function (n){
$('#i'+n).click();
}, n* 5000);
Così invece la n è indefinita, ma l'attesa funziona
 
probabilmente sarà una cazzata, e non so se funzioni realmente è un idea che mi è venuta di getto, ma se fai un thread e blocchi quello per tot secondi? :)
 
Non esistono funzioni per bloccare.. le uniche funzioni temporali sono setTimeout e setInterval la prima esegue dopo tot secondi, la seconda esegue a ripetizione dopo tot secondi.
Comunque credi di aver risolto creando una funzione esterna e richiamandola nel ciclo, devo testare domani se funziona
 
Stato
Discussione chiusa ad ulteriori risposte.