2012-10-24 6 views
0

Le code suivant affiche la date toutes les 1 s, puis s'arrête.JavaScript setInterval et setTimeout

(function() { 
    var i = setInterval(function() { 
     console.log(new Date()); 
    }, 1000); 
    console.log("Hi"); 

    setTimeout(function() { 
     clearInterval(i); 
    }, 3000); 
    console.log("Hola"); 
})(); 

Sortie:

Hi 
Hola 
Wed Oct 24 2012 13:35:27 GMT+0200 (CEST) 
Wed Oct 24 2012 13:35:28 GMT+0200 (CEST) 
Wed Oct 24 2012 13:35:29 GMT+0200 (CEST) 

Mais je ne sais pas pourquoi Hi et Hola sont affichés en premier. En outre, pourquoi setTimeout est exécuté? Il n'est pas supposé que setInterval est exécuté toutes les secondes et rien d'autre ne peut être exécuté? (Est-ce que le code ci-dessus s'exécute dans l'ordre dans lequel il est écrit?) Merci.

+0

Tout le code s'exécute tout de suite. – Esailija

+0

N ° 'setInterval' et' setTimeout' retournent immédiatement, et votre fonction continue. L'exécution de l'autre code sera interrompue lorsque le délai expire à une date ultérieure pour exécuter le code que vous avez fourni à ces appels. – sje397

+2

@ sje397 L'exécution du code courant ne sera pas suspendue. Au lieu de cela, les événements temporisés sont retardés si javascript est en cours d'exécution à ce moment. –

Répondre

3

setTimeout ainsi que setInterval enregistrent uniquement les fonctions (callbacks) mais aller directement à la commande suivante.

Par conséquent Hi et Hola sont imprimés avant que les premiers rappels soient appelés.

rappel premier sera celui de setInterval après 1 sec, puis de nouveau après 2 sec .. Après 3 secondes setTimeout coups de pied dans et efface setInterval.

+0

Donc, ils sont comme des gestionnaires? –

+2

@enrmarc Ouais. Vous gérez le fait qu'un certain temps s'est écoulé. –

2

http://ejohn.org/blog/how-javascript-timers-work/

Ces deux événements sont asynchrones. Ils sont mis en file d'attente/exécutés au moment disponible suivant, pas à l'heure exacte où "setTimeout" ou "setInterval" est appelé.

+0

Merci pour le lien. –

+0

Excellent lien. Upvoted. –

+0

J'ai compté deux fois dans les deux premiers paragraphes cet article indiquant qu'ils ne sont pas exécutés dans un fil séparé. – sje397

4

Les commentaires montrent l'ordre d'exécution

(function() {       // 0 anonymous function is called inline 

    var i = setInterval(function() { // 1 setInterval **schedules** the function 
             //  parameter to be executed every second 
     console.log(new Date()); 
    }, 1000); 
    console.log("Hi");     // 2 Display 'Hi' on console 

    setTimeout(function() {    // 3 **Schedule** the function parameter to 
             //  execute after three seconds 
     clearInterval(i);  
    }, 3000); 
    console.log("Hola");    // 4 Display 'Hola' on console 
})(); 

             // 5 Display date from setInterval function 

             // 6 Display date from setInterval function 

             // 7 Display date from setInterval function 

             // 8 Cancel setInterval executed from 
             //  setTimeout function 

Hope cela éclaircit votre confusion.

Questions connexes