Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

310
Visualizações
how to improve the settimeout?

why setTimeOut in this code doesn't work ? im tring to show submenus one by one , im not sure if the way is good , someone told me there is a problem in the closure

the code :

function changestyle(){
            var els = document.getElementsByClassName("submenu");
            for(var i = 0; i < els.length-1; i++)
            {

                
                const showone = function(){
                    els[i].style.display = 'block';
                    
                  };
            
                  const hideone = function(){
                    els[i].style.display = 'none';
                    
                  };
                  setTimeout(showone, 2000);
                setTimeout(hideone, 2000);
            }
            }
about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

The time for showing and hiding is colliding. You can try setTimeout(hideone, 3000); instead of setTimeout(hideone, 2000);

about 4 years ago · Juan Pablo Isaza Relatório

0

As pointet out in the comments this does not work because the div is shown and hidden "at the same time" so there wont be any visible effect.

You could solve this with a little helper function which resolves a promise after 2 seconds timeout. Make your function async and just await it.

const changestyle = async () => {
  var els = document.getElementsByClassName("submenu");
  for(var i = 0; i < els.length; i++) {
    const showone = () => {
      els[i].style.display = 'block';
    }
            
    const hideone =() => {
      els[i].style.display = 'none';
    }
    
    showone();
    await awaiter();
    hideone();
    await awaiter();
  }
}

const awaiter = () => {
  return new Promise(resolve => {
    setTimeout(resolve, 2000);
  });
}
changestyle()
.submenu {
  width: 30px;
  height: 30px;
  background-color: blue;
  display: none;
}
<div class="submenu"></div>
<div class="submenu"></div>
<div class="submenu"></div>

about 4 years ago · Juan Pablo Isaza Relatório

0

Please refer this. It may works for your case.

function changestyle(){
  var els = document.getElementsByClassName("submenu");
    for(var i = 0; i < els.length-1; i++) {
       els[i].style.display = 'block';
            
       const hideone = function(){
          els[i].style.display = 'none'; 
       };
       setTimeout(hideone, 2000);
     }
   }
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda