Callback

Em programação de computadores, um método de callback é uma rotina que é passada como parâmetro para outro método. É esperado então que o método execute o código do argumento em algum momento. A invocação do trecho pode ser imediata, como em um (callback síncrono), ou em outro momento (callback assíncrono).[1]

Os meios em que os callbacks são suportados em diferentes linguagens de programação diferem, porém eles são normalmente implementados com sub-rotinas, expressões lambda, blocos de código ou ponteiros de funções.

Uma função que recebe outra função como argumento é considerada uma função de ordem maior, em contraste à uma função de primeira ordem. Há de se notar no entanto que existem outros tipos de funções de ordem maior, como as que retornam uma nova função sem receber uma como argumento.

Uso

Em geral, callbacks são necessários para programação assíncrona. Em linguagens que a suportam, callbacks são uma forma de garantir que uma parte do código seja executada após uma ação na qual depende (por exemplo, uma resposta HTTP ou uma chamada de sistema).

Exemplos

JavaScript

Em JavaScript, funções ou métodos são cidadãos de primeira classe representados como objetos Function,[2] o que significa que podem ser passadas como valores. O método recipiente então pode invocar ou passar o método recebido adiante a qualquer momento.

function funcaoDeOrdemMaior (cb) {
    cb()
    console.log('Função de ordem maior invocada')
}

function meuCallback () {
    console.log('Callback invocado')
}

funcaoDeOrdemMaior(meuCallback)

No exemplo acima, o método funcaoDeOrdemMaior recebe um argumento cb que é invocado como um método. Para tanto, deve-se passar em sua invocação como primeiro argumento um outro método (neste exemplo, o método é meuCallback). Ao executar este código, a linha 7 será executada antes da linha 3, já que a linha 2 invoca meuCallback.

Expressões de função

É possível criar funções com expressões em vez de declarações. Isso permite que uma função seja criada no momento de sua invocação ou uso como valor. Desta forma, o exemplo acima poderia ser reescrito da seguinte forma:

function funcaoDeOrdemMaior (cb) {
    cb()
    console.log('Função de ordem maior invocada')
}

funcaoDeOrdemMaior(function meuCallback () {
    console.log('Callback invocado')
})

Python

Em Python, assim como em JavaScript, as funções são cidadãos de primeira classe.[3] No entanto, as sintaxes para declaração e expressão de funções diferem, devendo-se utilizar def para declarações e lambda para expressões.

def funcao_de_ordem_maior(cb):
    cb()
    print('Função de ordem maior invocada')
    
def meu_callback():
    print('Callback invocado')
    
funcao_de_ordem_maior(meu_callback)

Passando meu_callback como agumento para funcao_de_ordem_maior, podemos observar sua execução. Como o agumento cb é invocado antes de print em funcao_de_ordem_maior, pode-se observar que a linha 6 será executada antes da linha 3. É possível reescrever o exemplo acima utilizando uma expressão lambda no lugar da declaração de meu_callback, o que se mostra útil para métodos simples de uso único:

def funcao_de_ordem_maior(cb):
    cb()
    print('Função de ordem maior invocada')
    
funcao_de_ordem_maior(lambda: print('Callback invocado'))

Referências

  1. «Callback function - MDN Web Docs Glossary: Definitions of Web-related terms | MDN». developer.mozilla.org (em inglês). Consultado em 31 de maio de 2021 
  2. «Function - JavaScript | MDN». developer.mozilla.org (em inglês). Consultado em 31 de maio de 2021 
  3. here, Dan Bader-Get free updates of new posts. «Python's Functions Are First-Class». dbader.org (em inglês). Consultado em 31 de maio de 2021 
Ícone de esboço Este artigo sobre programação de computadores é um esboço. Você pode ajudar a Wikipédia expandindo-o.
  • v
  • d
  • e