2011-05-17 5 views
3
for (var i=list.length; i>=0; i--){ 
    //do something....      
} 

Je souhaite utiliser setInterval pour que ce processus prenne une minute entière, quel que soit le nombre d'éléments de la liste. Donc, s'il y a 10 éléments, il se déclencherait tous les 6sec, 30items, toutes les deux secondes, etcsetInterval sur une boucle for?

Merci pour toute aide!

+0

Pouvez-vous donner quelques informations générales sur ce que vous essayez d'accomplir? Pour prendre exactement une minute, cela dépend entièrement de ce que vous faites à chaque itération et de la durée d'une seule itération, ce qui peut être très difficile à réaliser. – Gerry

+1

Assurez-vous également de ne pas mettre de code critique sur la mission, et ne supposez pas qu'il se déclenchera toujours comme prévu. Je ne suis pas sûr qu'il soit encore implémenté dans Chrome, mais les navigateurs peuvent optimiser l'utilisation des ressources lorsque votre page est sur un onglet en arrière-plan et peuvent finir par appeler vos minuteurs avec des intervalles plus longs. – DarthJDG

Répondre

6

Quelque chose comme cela pourrait se faire:

var list = [1,2,3,4,5,6,7,8,9,10]; 
var timeFrame = 60000; 
var interval = timeFrame/(list.length-1); 
var i = 0; 

(function iterate() { 
    if (list.length > i) { 
     console.log(list[i]); 
     i++; 
    } 
    setTimeout(iterate, interval); 
})(); 

JsFiddle Demo

Je ne suis pas sûr si c'est ce que vous cherchez, mais cela va "itérer" à travers tous les éléments de la liste, sans utiliser for boucle, dans le délai donné. La fonction s'appellera toujours en utilisant setTimeout. Le délai d'expiration est calculé au début en fonction du nombre d'éléments. Cette solution est beaucoup plus "fiable" que setInterval. Le prochain délai d'attente sera défini lorsque l'action précédente est déjà effectuée, de sorte qu'il ne sera pas empilé.

+0

1 minute est 60000 millisecondes – mplungjan

+0

@mplungjan Oui, juste eu cette valeur pour le test :). J'ai oublié de le changer, merci. – kapa

+1

Vous pouvez mettre vos variables d'état d'itération dans une fermeture pour éviter d'utiliser des globales. Tu ne veux pas faire ce que j'ai fait à Ocamel. :) – DarthJDG

-1

Vous feriez

function code(i) { 
    return function() { alert(i); }; 
} 

var period = 60 * 1000/(list.length - 1); 
for (var i=list.length; i>=1; i--){ 
    setTimeout(code(list[i - 1]), period * (i - 1)); 
} 
+3

Le premier argument de setInterval devrait être la fonction, le second le délai. – Lekensteyn

+0

désolé, l'esprit incroyablement floue en ce moment – Novikov

+1

Exécutera la fonction sans délai. Voir [jsFiddle] (http://jsfiddle.net/RFw8A/). 'setTimeout' attend une fonction ou une chaîne (ce qui n'est pas conseillé d'être utilisé, c'est comme' eval') comme premier argument. Vous appelez une fonction au lieu de donner une fonction comme argument, donc à moins que 'code()' retourne une fonction, cela ne fonctionnera pas. – kapa

-2

Essayez quelque chose comme ce qui suit:

var interval = 2; 
for (var i=list.length; i>=0; i--){ 
    setTimeout(your_code_here(), i*interval); 
} 
+1

Cela ne fonctionnerait pas car vous exécutez immédiatement la fonction. Supprimez le() de your_code_here - aussi vous l'exécutez en x * 2 millisecondes. – mplungjan

+0

Commentaire à poster par @ i100: Je ne pense pas que cela fonctionne: var interval = 2; pour (var i = liste.longueur; i> = 0; i -) {setTimeout (votre_code_here(), i * intervalle); } quand le "your_code_here()" attend l'exécution, la boucle continue toujours. et la boucle sera faite dans un temps très court (peut-être 1ms ou moins, dépend de votre processeur) – Yuankun

1
var totalItem = list.length; 
setInterval(function(){ alert('');}, 60000/totalItem); 
+2

Alert est une instruction de blocage. J'ai corrigé votre orthographe aussi – mplungjan

+0

thnx ... pour correction ... – KoolKabin