Se eu tiver um tempo limite ativo em execução configurado var t = setTimeout("dosomething()", 5000)
,
Existe alguma maneira de pausar e retomá-lo?
Existe alguma maneira de obter o tempo restante no tempo limite atual?
ou eu tenho que em uma variável, quando o timeout está definido, armazenar a hora atual, então fazemos uma pausa, pegamos a diferença entre agora e então?
javascript
timeout
Hailwood
fonte
fonte
Respostas:
Você poderia embrulhar
window.setTimeout
assim, que eu acho que é semelhante ao que você estava sugerindo na pergunta:fonte
setTimeout()
não funciona no Internet Explorer <= 9.timer.resume(); timer.resume();
isso, terá dois tempos limite paralelos. É por isso que você desejaclearTimeout(timerId)
primeiro ou fazer umif (timerId) return;
curto-circuito logo no início do currículo.var timerId, start, remaining;
fora do escopo de classe e adicionar deremaining = delay;
volta para dentro para capturar o parâmetro. Funciona como um encanto tho!if (blah) { ... }
) ou algo assim?Algo assim deve resolver o problema.
fonte
+new Date()
paranew Date().getTime()
uma vez que é mais rápido: jsperf.com/date-vs-gettimeNão. Você precisará cancelar (
clearTimeout
), medir o tempo desde que você iniciou e reiniciá-lo com o novo tempo.fonte
Uma versão ligeiramente modificada da resposta de Tim Downs . No entanto, uma vez que Tim reverteu minha edição, tenho que responder isso sozinho. Minha solução torna possível usar extra
arguments
como terceiro (3, 4, 5 ...) parâmetro e limpar o cronômetro:Como o Tim mencionou, parâmetros extras não estão disponíveis no
IE lt 9
, no entanto, trabalhei um pouco para que funcionasse nooldIE
do também.Uso:
new Timer(Function, Number, arg1, arg2, arg3...)
fonte
"Pausar" e "retomar" não fazem muito sentido no contexto de
setTimeout
, o que é algo pontual . Você quer dizersetInterval
? Se sim, não, você não pode pausá-lo, você pode apenas cancelá-lo (clearInterval
) e, em seguida, reajustá-lo novamente. Detalhes de tudo isso na seção Timers das especificações.fonte
O Timeout foi fácil de encontrar uma solução, mas o Interval foi um pouco mais complicado.
Eu criei as duas classes a seguir para resolver esses problemas:
Eles podem ser implementados como:
Este exemplo definirá um tempo limite pausável (pt_hey) que está programado para alertar, "hey" após dois segundos. Outro tempo limite pausa o pt_hey após um segundo. Um terceiro tempo limite retoma o pt_hey após dois segundos. pt_hey é executado por um segundo, pausa por um segundo e, em seguida, retoma a execução. pt_hey dispara após três segundos.
Agora, para os intervalos mais complicados
Este exemplo define um intervalo pausável (pi_hey) para escrever "hello world" no console a cada dois segundos. Um tempo limite pausa pi_hey após cinco segundos. Outro tempo limite recomeça pi_hey após seis segundos. Então pi_hey irá disparar duas vezes, correr por um segundo, pausar por um segundo, correr por um segundo e então continuar disparando a cada 2 segundos.
OUTRAS FUNÇÕES
clearTimeout () e clearInterval ()
pt_hey.clearTimeout();
epi_hey.clearInterval();
serve como uma maneira fácil de limpar os tempos limite e intervalos.getTimeLeft ()
pt_hey.getTimeLeft();
epi_hey.getTimeLeft();
retornará quantos milissegundos até que o próximo gatilho esteja programado para ocorrer.fonte
setInterval
? Acho que um simplesif(!true) return;
vai resolver o problema, ou estou errado?Eu precisava calcular o tempo decorrido e restante para mostrar uma barra de progresso. Não foi fácil usar a resposta aceita. 'setInterval' é melhor do que 'setTimeout' para esta tarefa. Então, criei essa classe Timer que você pode usar em qualquer projeto.
https://jsfiddle.net/ashraffayad/t0mmv853/
fonte
/reviver
Versão ES6 usando açúcar sintático Class-y 💋
(ligeiramente modificado: adicionado start ())
fonte
Você poderia olhar em clearTimeout ()
ou pausar dependendo de uma variável global que é definida quando uma determinada condição é atingida. Como se um botão fosse pressionado.
fonte
Você também pode implementá-lo com eventos.
Em vez de calcular a diferença de tempo, você começa e para de ouvir um evento 'tick' que continua em execução em segundo plano:
fonte
Se você estiver usando jquery de qualquer maneira, verifique o plugin $ .doTimeout . Essa coisa é uma grande melhoria em relação ao setTimeout, incluindo permitir que você mantenha o controle de seus tempos limite com um único id de string que você especifica e que não muda toda vez que você o configura, e implementa cancelamento fácil, loops de pesquisa e eliminação de pontos e Mais. Um dos meus plug-ins jquery mais usados.
Infelizmente, ele não oferece suporte para pausa / retomada fora da caixa. Para isso, você precisaria quebrar ou estender $ .doTimeout, provavelmente de forma semelhante à resposta aceita.
fonte
Eu precisava ser capaz de pausar setTimeout () para um recurso semelhante a uma apresentação de slides.
Aqui está minha própria implementação de um cronômetro pausável. Ele integra comentários vistos na resposta de Tim Down, como uma pausa melhor (comentário do kernel) e uma forma de prototipagem (comentário de Umur Gedik).
Exemplo:
Para testar o código, use
timer.resume()
etimer.pause()
algumas vezes e verifique quanto tempo resta. (Certifique-se de que seu console esteja aberto.)Usar este objeto no lugar de setTimeout () é tão fácil quanto substituir
timerID = setTimeout( mycallback, 1000)
portimer = new Timer( mycallback, 1000 )
. Entãotimer.pause()
etimer.resume()
estão disponíveis para você.fonte
demonstração de trabalho "async" em: site zarsoft.info
fonte
Implementação de texto digitado com base na resposta com melhor classificação
fonte
Você pode fazer o seguinte para tornar setTimeout pausável no lado do servidor (Node.js)
e você pode verificar como abaixo
fonte
Não acho que você encontrará nada melhor do que clearTimeout . De qualquer forma, você sempre pode agendar outro tempo limite mais tarde, em vez de "reiniciá-lo".
fonte
Se você tiver vários divs para ocultar, poderá usar um
setInterval
e vários ciclos para fazer o seguinte:fonte