loading...
Cover image for Convertendo Callbacks para Promises no Node.js

Convertendo Callbacks para Promises no Node.js

gabrielrufino profile image Gabriel Rufino ・1 min read

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

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

Era isso! Obrigado :D

Posted on by:

gabrielrufino profile

Gabriel Rufino

@gabrielrufino

Fullstack Developer around JavaScript stack. Solving problems, generating value!

Discussion

markdown guide