DEV Community

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

Posted on

5 1

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

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay