Sleep em Generator

Sleep em Generator

Tulio Faria
Tulio Faria28 de junho de 2017
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:
xmVWF1RU3n4
Assistir 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!
Tulio Faria
Autor
Tulio Faria28 de junho de 2017

Últimas do Blog