Javascript

Sleep em Generator

T
Por Tulio Faria 28 de junho de 2017
Sleep em Generator

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!