Skip to content

Descubra os Temporizadores JavaScript

setTimeout()

Ao escrever código JavaScript, você pode querer atrasar a execução de uma função.

Este é o trabalho do setTimeout. Você especifica uma função de callback para executar mais tarde e um valor expressando o quão tarde você deseja que ela seja executada, em milissegundos:

js
setTimeout(() => {
  // executa após 2 segundos
}, 2000)
setTimeout(() => {
  // executa após 50 milissegundos
}, 50)

Esta sintaxe define uma nova função. Você pode chamar qualquer outra função que desejar ali, ou pode passar um nome de função existente e um conjunto de parâmetros:

js
const myFunction = (firstParam, secondParam) => {
  // faça algo
}
// executa após 2 segundos
setTimeout(myFunction, 2000, firstParam, secondParam)

setTimeout retorna o id do temporizador. Isso geralmente não é usado, mas você pode armazenar este id e limpá-lo se quiser excluir esta execução de função agendada:

js
const id = setTimeout(() => {
  // deve executar após 2 segundos
}, 2000)
// Mudei de ideia
clearTimeout(id)

Atraso zero

Se você especificar o atraso de tempo limite para 0, a função de callback será executada o mais rápido possível, mas após a execução da função atual:

js
setTimeout(() => {
  console.log('depois ')
}, 0)
console.log(' antes ')

Este código imprimirá

bash
antes
depois

Isso é especialmente útil para evitar bloquear a CPU em tarefas intensivas e permitir que outras funções sejam executadas enquanto executa um cálculo pesado, colocando funções em fila no planejador.

TIP

Alguns navegadores (IE e Edge) implementam um método setImmediate() que faz exatamente a mesma funcionalidade, mas não é padrão e indisponível em outros navegadores. Mas é uma função padrão no Node.js.

setInterval()

setInterval é uma função semelhante a setTimeout, com uma diferença: em vez de executar a função de callback uma vez, ela a executará para sempre, no intervalo de tempo específico que você especificar (em milissegundos):

js
setInterval(() => {
  // executa a cada 2 segundos
}, 2000)

A função acima é executada a cada 2 segundos, a menos que você diga para ela parar, usando clearInterval, passando a ela o id do intervalo que setInterval retornou:

js
const id = setInterval(() => {
  // executa a cada 2 segundos
}, 2000)
// Mudei de ideia
clearInterval(id)

É comum chamar clearInterval dentro da função de callback setInterval, para permitir que ela determine automaticamente se deve executar novamente ou parar. Por exemplo, este código executa algo a menos que App.somethingIWait tenha o valor chegou:

setTimeout Recursivo

setInterval inicia uma função a cada n milissegundos, sem qualquer consideração sobre quando uma função terminou sua execução.

Se uma função sempre leva a mesma quantidade de tempo, tudo bem.

Talvez a função leve tempos de execução diferentes, dependendo das condições de rede.

E talvez uma execução longa se sobreponha à próxima.

Para evitar isso, você pode agendar um setTimeout recursivo para ser chamado quando a função de retorno de chamada terminar:

javascript
const myFunction = () => {
  // faça algo
  setTimeout(myFunction, 1000)
}
setTimeout(myFunction, 1000)

setTimeout e setInterval estão disponíveis no Node.js, através do módulo Timers.

O Node.js também fornece setImmediate(), que é equivalente ao uso de setTimeout(() => {}, 0), usado principalmente para trabalhar com o Loop de Eventos do Node.js.