Usando promisify NodeJS 8
Estava estudando as novas funcionalidades do NodeJS 8, e uma funcionalidade que pegou muitos desenvolvedores de surpresa é o promisify. O que é de fato essa feature? Ela vai “promisificar” as funções com callback, retornando uma promise? Então, resolvi criar um exemplo para explicar de que forma utilizá-la.
Primeiramente, iremos importar a biblioteca útil e já criar outra variável para usar a promisify conforme abaixo.
const util = require('util'); const promisify = util.promisify;
Agora, iremos criar uma função que recebe uma chamada de retorno conhecida como callback, na qual ela vai retornar uma tabuada.
function calcTable(num, callback) { let res = []; if(typeof num !== 'number'){ throw new Error('must param not is number'); } for(var i=0; i<=10; i++){ res.push(i*num); } callback(res); }
Conforme o código acima, identificamos que nossa função recebe dois parâmetros: o primeiro é o numero de qual tabuada você deseja e o segundo a nossa callback. Sendo assim, precisamos prestar atenção em dois detalhes - o primeiro é que, no fim dela há o retorno desejado. O segundo detalhe é que estamos tratando um erro, ou seja, se não for um número o nosso parâmetro, ele vai indicar o erro “must param not is number”. É possível transformar essa função em uma promessa usando o novo método do NodeJS 8, conforme código abaixo. // It can also be that way -> calcTable = promisify(calcTable); const myPromise = promisify(calcTable);
Bem simples. Agora, iremos testar nossa promessa que reagiu com sucesso. myPromise(7) .then(success => console.log(success)) // return [ 0, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70 ] .catch(fail => console.log(fail));
Percebemos que ele irá retornar a tabuada do 7, pois foi a que desejamos passando na nossa promessa. Agora vamos supor que passamos uma string por engano, ou seja, ele vai invocar o “new Error”. Mas, como é uma promessa, ela vai retornar ao “catch”. Vejamos abaixo: myPromise('seven') .then(success => console.log(success)) .catch(fail => console.log(fail)); /** return * Error: must param not is number * at calcTable (C:\... */
Agora ficou bem simples encapsular suas funções para uma promessa, além de deixar o código mais legível - não irá retornar um undefined na sua chamada de retorno à famosa callback. Espero ter ajudado e contribuído com o aprendizado de vocês. Link do código: Cliquei Aqui!