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)