Bonjour

Quelqu'un peut m'aider ,j'aimerais comprendre enfaite le fonctionnement de l'event loop

je sais que setInterval() est une fonction asynchrone et execute en boucle une instruction

let sec = 3

let countSecond = setInterval(function(){
    sec -= 1
    console.log(sec)
},1000)
console.log('#'+sec)//#3:cette valeur ne change pas
if(sec == 0)
{
    clearInterval(countSecond)
}

**setInterval() m'affiche une nouvel valeur a chaque fois mais en dehors de la fonction "sec" ne change pas,donc la fonction clearInterval()

**n'est jamais executé

Comment résoudre ce problème?
Merci de vos reponses

3 réponses


popotte
Réponse acceptée

En gros ton if ne vérifies qu'une seule fois si sec === 0, ensuite ton setInteval modifie la valeur des sec toutes les secondes, et quand il arrive a zéro ton code ne calcules pas le if qu'il a déjà utilisé

A chaques fois que tu modifies la valeur de sec, il faut que tu relances ton if, en mettant ce if dans la boucle setInterval:

  let sec = 3

  let countSecond = setInterval(function(){
      sec -= 1
      console.log(sec)

     console.log('#'+sec)//#3:cette valeur va changer ^^
      if(sec == 0)
      {
          clearInterval(countSecond)
      }
  },1000)

Après en orienté objet tu peux te faire un listenner pour observer tout ton code, maaais la ce serait plus simple de passer par React que de créer soit meme le listenner x)

Sinon rien a voir mais en code c'est mieux de morceler au maximum le code, histoire d'avoir le bon réflexe quand tu fera un gros projet :p


  let sec = 3

  function decrement() {
    sec -= 1    
    if(sec == 0) clearInterval(countSecond)
  }

  let countSecond = setInterval(decrement(),1000)
Opening1
Auteur

Merci Popotte tres bonne reponse,j'ai seulement une chose à ajouter que je viens enfaite de comprendre
La raison pour laquelle la variable declaré dans le scope globale n'est pas modifié c'est parceque setInterval() crée un clone de la variable
donc il modifie la variable seulement dans son scope,
c'est bon à savoir !!! je tenais à la partager

Ah oui il y'a ça aussi, mais en vrai c'est une bonne chose, on créée un clone pour respecter l'immutabilité (dès fois c'est utile, des fois comme dans ce script ça ne sert a rien, mais c'est la règle :p) ^^