DEV Community

Cover image for Convertendo Callbacks para Promises no Node.js
Gabriel Rufino
Gabriel Rufino

Posted on

Convertendo Callbacks para Promises no Node.js

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)
  }
})
Enter fullscreen mode Exit fullscreen mode

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)
  })
Enter fullscreen mode Exit fullscreen mode

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 */)
Enter fullscreen mode Exit fullscreen mode

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)
  }) 
Enter fullscreen mode Exit fullscreen mode

Importante: A função deve seguir o padrão callback

  1. O callback deve ser o ultimo argumento
  2. O primeiro argumento do callback deve ser o possível erro

Era isso! Obrigado :D

Top comments (0)