Desenvolvimento

29 abr, 2019

Entendendo funções callback em JavaScript

Publicidade

O intuito deste artigo é explicar através de um passo a passo, o que são funções callback e sua sintaxe de uso. Para tópicos mais avançados, aguarde os próximos artigos.

Para quem veio de uma linguagem síncrona como AdvPL, C, Python e tantas outras, é desafiador mudar a maneira de pensar. JavaScript é uma linguagem executada assincronamente – isso acontece porque quando o interpretador executa um comando que depende de uma informação externa, como uma requisição ele não bloqueia o prosseguimento do programa. Essa característica do JavaScript é extremamente utilizada no Node.js.

Para os que estão iniciando na linguagem, pode parecer que estou falando bobagem; mas isso acontece porque quem começou a mexer com a linguagem há pouco tempo, provavelmente nunca utilizou Ajax ou trabalhou em cima de uma informação retornada de um banco de dados. Quer tirar a prova dos nove? Então, vamos lá! Execute o seguinte script:

setTimeout(() => alert("1"),5000);
alert("2");

Ao executar esse código no navegador, as coisas acontecem na seguinte ordem:

  • : é apresentado um alerta com o conteúdo “2”
  • : após cinco segundos, o próximo alerta é exibido, com conteúdo “1”

As coisas não são executadas na ordem em que o código está escrito, pois como a função setTimeout espera cinco segundos para apresentar o alerta, o processamento segue, executando o alert(“2”) primeiro.

Essa função setTimeout, normalmente é utilizada por instrutores para simular uma requisição HTTP, ou um acesso ao banco de dados.

Neste artigo não explicarei o conceito de sincronicidade e assincronicidade para não me estender demasiadamente, mas com um simples Google você pode achar excelentes explicações. Let’s focus on the code!

Mas o que são funções callback?

De forma simples, callback é uma função passada como parâmetro para outra função. Sem saber, você acabou de usar uma função callback no código acima.

A função setTimeout recebe dois parâmetros: o primeiro é uma função callback, e o segundo é o tempo que o interpretador irá esperar até executar essa função.

Na programação assíncrona, callbacks são passadas como funções para serem executadas após um certo evento. Por exemplo, um programa calcula o salário líquido a partir do bruto e faz algo com esse valor calculado. Nesse caso, podemos fazer da seguinte forma:

let salarioBruto = 3000;
let salarioLiquido;
getSalario(salarioBruto, (resultado) => {
    salarioLiquido = resultado;
    console.log(`O salário liquido é ${salarioLiquido}`);
});
function getSalario(salarioBruto, callback)
{
    let liquido = 0;
    const inss = salarioBruto * 0.11;
    const vr = salarioBruto * 0.05;
    const vt = salarioBruto * 0.06;
    const fgts = salarioBruto * 0.15;
    const descontos = inss + vr + vt + fgts;
    liquido = salarioBruto - descontos;
    
    return callback(liquido);
}

Vamos dissecar o código para entender como funcionam as callbacks.  Comecemos pela declaração da função getSalario. Essa função recebe dois parâmetros: salarioBruto, que é o valor de entrada do cálculo, e callback, que é uma função que será executada no return da função getSalario.

Ainda não vamos nos preocupar com o que faz essa função de callback – apenas entenda que a getSalario a recebe como parâmetro e a executa no return, passando como parâmetro para a callback o salário líquido calculado.

Então, a função getSalario recebe um valor de salário bruto no primeiro parâmetro: getSalario(salarioBruto, … obtém o salário líquido subtraindo os descontos calculados: liquido = salarioBruto – descontos;, e então executa a função recebida no segundo parâmetro: return callback(liquido);.

Entendido isso, vamos à declaração da função callback. A nossa callback é definida na passagem do segundo parâmetro durante a invocação da getSalario: getSalario(salarioBruto, (resultado) => ….

Neste exemplo, usamos a sintaxe de arrow functions: (parâmetro) => {//código a ser executado}. Na declaração da nossa função callback, estamos dizendo que ela receberá um parâmetro que é o resultado do cálculo do salário líquido, e o código que ela irá executar será uma atribuição e depois um console.log, informando o salário líquido.

(resultado) => {
     salarioLiquido = resultado;
     console.log(`O salário liquido é ${salarioLiquido}`);}

Na hora em que se está declarando a callback, pode surgir a dúvida:

  • “Mas de onde vai vir esse valor ‘resultado’ que estou utilizando?”

A sacada está aí! A variável ‘resultado’ está na declaração da callback para representar um parâmetro – ou um valor, se preferir – que será passado quando a função callback for invocada dentro da função getSalario. Portanto, quando a função callback for executada, ela será executada da seguinte forma:

(liquido) => {
     salarioLiquido = liquido;
     console.log(`O salário líquido é ${salarioLiquido}`);}

Neste caso, líquido é o valor calculado na função getSalario. Portanto, uma callback é uma função que te permite operar em cima do retorno de outras funções da forma que for necessário. Eu poderia, por exemplo, ter passado o seguinte código na declaração:

(resultado) => {
  let bonus = 100;
salarioLiquido = resultado + bonus;
     console.log(`O salário líquido é ${salarioLiquido}`);}

E aí, entendeu o que são funções callback? Agora você já sabe usar essa ferramenta maravilhosa da programação assíncrona.

No próximo artigo vamos aprender a usar de forma mais profissional as funções callback.

Até mais!

***

Artigo original publicado no TOTVS Developers e republicado com autorização do autor, Victor F. dos Santos: https://medium.com/totvsdevelopers/entendendo-fun%C3%A7%C3%B5es-callback-em-javascript-7b500dc7fa22