Pergunta

Eu acho que posso estar cansado, mas não posso, pois a vida de mim entende isso, e acho que é devido à falta de conhecimento de JavaScript

var itv=function(){
 return setInterval(function(){
  sys.puts('interval');
 }, 1000);
}
var tout=function(itv){
 return setTimeout(function(){
  sys.puts('timeout');
  clearInterval(itv);
 }, 5500);
}

Com essas duas funções que posso ligar

a=tout(itv());

e obtenha um cronômetro de loop para executar por 5,5 segundos e depois sair, essencialmente.



Pela minha lógica, isso deve funcionar, mas simplesmente não é

var dotime=function(){
 return setTimeout(function(){
  clearInterval(function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  });
 }, 5500);
}

Qualquer insight sobre esse assunto seria apreciada.

Foi útil?

Solução

não pode funcionar porque seu setInterval será chamado após o tempo limite! Sua abordagem original está correta e você ainda pode envolver isso em uma única função:

var dotime=function(){
  var iv = setInterval(function(){
    sys.puts("interval");
  }, 1000);
  return setTimeout(function(){
    clearInterval(iv);
  }, 5500);
};

Outras dicas

Eu acho que o erro que você está cometendo é que a função itv não retorna setInterval(function(){ sys.puts('interval'); }, 1000) ele executa setInterval(function(){ sys.puts('interval'); }, 1000) e do que retorna um ID que o setInterval gera. Esse id é então passado para o clearInterval função para parar o que setInterval(function(){ sys.puts('interval'); }, 1000) está fazendo.

Editar: Um exemplo de uma função que funcionaria.

var dotime=function(){
 // Start our interval and save the id
 var intervalId = setInterval(function(){
  // This will get executed every interval
  sys.puts("interval");
 }, 1000);

 // Start our timout function
 setTimeout(function(){
  // This will get executed when the timeout happens
  clearInterval(intervalId); // Stop the interval from happening anymore
 }, 5500);
}

Essa é outra maneira de escrever sua versão, você vê que você passa uma função para limpar o intervalo, onde deveria ter passado por um ID do timer.

var dotime=function(){
 var g=function(){
  var f=function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  }
  clearInterval(f);
 }
 return setTimeout(g, 5500);
}

Para fazer funcionar, você chama a função:

  clearInterval(f());

Ou, usando sua versão:

var dotime=function(){
 return setTimeout(function(){
  clearInterval(function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  }());
 }, 5500);
}

Isenção de responsabilidade: eu não testei isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top