JavaScript Settimeout SetInterval em uma função
-
20-09-2019 - |
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.
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.