Um padrão muito usado no início do Node.js foi o padrão Callback. Esse padrão foi a primeira forma de resolver o assincronismo da single thread do JavaScript.
Veja um exemplo fake abaixo:
function getUserCallback(id, callback) { setTimeout(function () { callback(null, { id, name: 'Gabriel Rufino' }) }, 2000) } getUserCallback(1234, function (error, user) { if (!error) { console.log(user) } })
Felizmente, hoje nós temos Promises e a dupla amável async/await
para tratar o fluxo assíncrono de forma mais elegante.
A mesma função getUser
usando Promise
:
function getUserPromise(id) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve({ id, name: 'Gabriel Rufino' }) }, 2000) }) } getUserPromise(1234) .then(function (user) { console.log(user) }) .catch(function (error) { console.error(error) })
Mas nem tudo são flores. Ainda existem diversas funções ou pacotes npm que funcionam apenas com callbacks. Com sorte, o Node.js tem por padrão uma função que nos ajuda a transformar funções que recebem um callback como um argumento para uma função que retorna uma Promise
.
É o helper util.promisify
:
const util = require('util') const functionPromise = util.promisify(/* Função aqui */)
Veja um exemplo de conversão:
const { promisify } = require('util') const getUserCallback = require('./getUserCallback') getUserCallback(1234, function (error, user) { if (!error) { console.log(user) } }) const getUserPromise = promisify(getUserCallback) getUserPromise(1234) .then(function (user) { console.log(user) }) .catch(function (error) { console.log(error) })
Importante: A função deve seguir o padrão callback
- O callback deve ser o ultimo argumento
- O primeiro argumento do callback deve ser o possível erro
Era isso! Obrigado :D
Top comments (0)