Skip to content

Instantly share code, notes, and snippets.

@suissa
Last active March 16, 2018 04:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save suissa/a4695d5481a190ae3c1d4d86d80e0e33 to your computer and use it in GitHub Desktop.
Save suissa/a4695d5481a190ae3c1d4d86d80e0e33 to your computer and use it in GitHub Desktop.
Lazy Callback is BORN

Lazy Callback - Se não existia agora existe!

Esse artigo será apenas a introdução à esse conceito que me veio como uma solução específica para o uso de temporizadores como setInterval.

Aviso

Esse código foi feito para rodar no BACKEND com Node.js > 8.9

Problema

Imagine que você precisam receber um objeto do setInterval para poder cancelar, porém você quer cancelar ele DENTRO do callback do setInterval, que só retorna o objeto necessário quando você CRIA o setInterval com callback e o time.

const func = () => {}
const interval = setInterval(func, 1000)
console.log(interval)
const func = () => {

  // preciso cancelar o setInterval aqui dentro
  if(something) clearInterval(interval)
  
}
const interval = setInterval(func, 1000)
console.log(interval)

Solução - Lazy Callback

No artigo completo explicarei melhor o porquê desse nome e espero achar mais usos fora o setInterval, por hora eu resolvi da seguinte forma:

const cb = () => { console.log('cb') }
const interval = setInterval(cb, 1000)

const lazy = () => {
  console.log('lazy')
  // preciso cancelar o setInterval aqui dentro
  // if(something) clearInterval(interval)
}

interval._onTimeout = lazy

Como eu cheguei nessa solução explicarei detalhadamente ainda esse mês, mas basicamente o que eu fiz foi:

  1. Criar setInterval com um callback padrão que não será executado.
  2. Criar o lazy callback, o qual aproveita-se do acesso ao objeto retornado.
  3. Definir o lazy callback na proprieda _onTimeout.
  4. Pronto.

Vou deixar aqui um exemplo deverás simples dessa prova de conceito:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment