Hoje quero mostrar como podemos recriar o famoso sleep, que temos em algumas linguagens que não são assíncronas como JAVA e PHP, quando queremos usar dentro de um Generator function. Eu cheguei nessa função porque queria fazer testes de algumas operações e naquele dado momento que queria rodar a Generator, queria pausar um pouco entre elas para ver um detalhe acontecer a fim de depurar o código. Então acabei refletindo como poderia criar esse sleep para conseguir fazer esse teste.
Para fazer o teste vamos utilizar o CO, que é uma forma de rodarmos uma Generator Function. Lembrando que uma Generator Function é uma função que pode ser pausada e retornada posteriormente, com isso podemos escrever uma função síncrona, porém continua tendo os benefícios da função assíncrona.
Vamos lá, a primeira coisa que vou fazer é importar o CO.
const co = require('co')
Se fossemos escrever realmente uma Generator Function iriamos fazer o seguinte:
co(function* () {
console.log('Step 1')
sleep(1000)
console.log('Step 2')
})
Em JavaScript não temos sleep, obviamente, porque não faz muito sentido porque temos o setTimeout.
Como transformamos o setTimeout em um sleep?
Primeiro vamos criar uma função chamada sleep e para transformar esse setTimeOut em um sleep. Eu teria que transformá-la em uma promise e para essa promise passar uma função que vai receber 2 parâmetros, o resolve e o reject, ou seja, dois callBacks:
function sleep(time){
return new Promise((resolve, reject) =>
setTimeout(resolve, time)
})
Com isso, quando chamar o sleep eu consigo utilizar o then para saber que ele rodou depois de um segundo:
sleep(1000).then(() => console.log('Depois de um segundo'))
Mas queremos utilizar dentro do CO porque quero essa ‘cara’ de assíncrona, então ao invés de utilizar apenas o sleep, vou utilizar o yield sleep, pausando entre os steps.
co(function* () {
console.log('Step 1')
yield sleep(1000)
console.log('Step 2')
})
Com isso temo um sleep mais próximo que tínhamos por exemplo em C, Pascal ou até o PHP.
Confira os passos em vídeo:
Curta o DevPleno no Facebook, inscreva-se no canal e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.