Promisify-Node: Convertendo funções clássicas do Node em Promises

Promisify-Node: Convertendo funções clássicas do Node em Promises

Tulio Faria
Tulio Faria4 de maio de 2017
Neste post, vamos fazer um hands-on do Promisify-Node, uma forma de converter as funções clássicas do Node em JavaScript que retornam callback em promises. Existem vários módulos que já fazem isso, como em módulos utilitários de promises, o q, bluebird, por exemplo.
Então por que usar o Promisify-Node?
Ele tem uma funcionalidade bastante relevante que vou mostrar durante o hands-on, vamos lá. Para instalar e adicionar como dependência o Promisify-Node:

yarn add promisify-node

Vamos importar o promisify e o fs(file system) para termos uma função com o callBack.

const promisify = require('promisify-node') const fs = require('fs')

Se fossemos utilizar o fs normalmente, iriamos fazer o seguinte:

fs.readFile('arquivo.js', (err, data) => console.log(data.toString()))

Então ele retorna um callBack, onde eu consigo escrever o conteúdo do arquivo. Então vamos converter essa função em promise para, por exemplo, usar o then dentro de um generator ou com async/await.
Podemos pegar essa função fs.readFile, criar uma nova readFile e passar para promisify, assim:

const readFile = promisyfy(fs.readFile)

Qual a diferença?
Agora eu posso chamar a readFile, falar qual arquivo eu quero (no caso o arquivo.js) e chamar ele no modo promisify.

readFile('arquivo.js').then((data) => console.log(data.toString()))

Qual a vantagem?
Além da promisify ser mais fácil de manipular, evitamos o callback hell ou código hadouken, que faz uma barrigona de tanto callback que tem um dentro do outro.
Também podemos utilizar com generator e com async/await. Outra coisa legal é que, se quisermos usar todas as funções do fs como uma promise, podemos mudar o Const fs = require('fs') assim:

const fs = promisify('fs')

E, assim, qualquer função que eu for utilizar, como por exemplo:

fs.readFile('arquivo.js', (err, data) => console.log(data.toString()))

Já irá virar naturalmente uma promise, com isso posso fazer:

fs.readFile('arquivo.js').then((data) => console.log(data.toString()))

Convertendo todos os métodos e funções disponíveis dentro desse módulo, de callback para promise.
Concluindo
Ainda estamos usando o fs.readFile, mas em uma versão 'promisifiada' :) Isso é bastante poderoso, afinal assim podemos converter um módulo inteiro, de callback para promise utilizando generator ou async/await tranquilamente.
Você também pode conferir o passo a passo desse hands-on por vídeo:
-Uy6Ri631H4
Assistir vídeo
Fique à vontade para deixar suas dúvidas e sugestões nos comentários. 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 Faria4 de maio de 2017

Últimas do Blog