Existe uma maneira de passar mais dados para uma função de retorno de chamada no jQuery?
Eu tenho duas funções e quero que o retorno de chamada para $.post
, por exemplo, passe os dados resultantes da chamada AJAX, bem como alguns argumentos personalizados
function clicked() {
var myDiv = $("#my-div");
// ERROR: Says data not defined
$.post("someurl.php",someData,doSomething(data, myDiv),"json");
// ERROR: Would pass in myDiv as curData (wrong)
$.post("someurl.php",someData,doSomething(data, myDiv),"json");
}
function doSomething(curData, curDiv) {
}
Quero poder passar meus próprios parâmetros para um retorno de chamada, bem como o resultado retornado da chamada AJAX.
Respostas:
A solução é a ligação de variáveis através do fechamento.
Como um exemplo mais básico, aqui está um exemplo de função que recebe e chama uma função de retorno de chamada, bem como uma função de retorno de chamada de exemplo:
Isso chama o retorno de chamada e fornece um único argumento. Agora você deseja fornecer um argumento adicional, para encerrar o retorno de chamada.
Ou, mais simplesmente, usando as funções de seta do ES6 :
Quanto ao seu exemplo específico, eu não usei a
.post
função no jQuery, mas uma rápida verificação da documentação sugere que a chamada de retorno deve ser um ponteiro de função com a seguinte assinatura:Portanto, acho que a solução é a seguinte:
O que está acontecendo?
Na última linha,
doSomething(extraStuff)
é invocado e o resultado dessa invocação é um ponteiro de função .Porque
extraStuff
é passado como argumento paradoSomething
ele, está dentro do escopo dadoSomething
função.Quando
extraStuff
é referenciado na função interna anônima retornadadoSomething
, é vinculado pelo fechamento doextraStuff
argumento da função externa . Isso é verdade mesmo após odoSomething
retorno.Não testei o acima, mas escrevi um código muito semelhante nas últimas 24 horas e funciona como descrevi.
É claro que você pode passar várias variáveis em vez de um único objeto 'extraStuff', dependendo de suas preferências pessoais / padrões de codificação.
fonte
Ao usar
doSomething(data, myDiv)
, você realmente chama a função e não faz referência a ela.Você pode passar a
doStomething
função diretamente, mas deve garantir que ela tenha a assinatura correta.Se você deseja continuar fazendo algo do jeito que está, pode encerrar sua chamada em uma função anônima.
Dentro do código de função anônimo, você pode usar as variáveis definidas no escopo em anexo. É assim que o escopo do Javascript funciona.
fonte
return function(...){...}
função extra dentro dadoSomething
função. Encontrei outro exemplo claro do mesmo conceito aqui: theelitist.net/…(function(myDiv){ ... })(myDiv)
para capturar a variávelmyDiv
. Isso é feito implicitamente na resposta @bradhouse.Na verdade, é mais fácil do que todo mundo está fazendo parecer ... especialmente se você usar a
$.ajax({})
sintaxe básica versus uma das funções auxiliares.Basta passar o
key: value
par como faria em qualquer objeto, ao configurar sua solicitação ajax ... (porque$(this)
ainda não mudou o contexto, ainda é o gatilho para a ligação acima)Uma das razões pelas quais isso é melhor do que definir o var, é que o var é global e, como tal, substituível ... se você tem duas coisas que podem acionar chamadas ajax, em teoria, você pode acioná-las mais rapidamente do que as chamadas ajax respondem e você teria o valor da segunda chamada passado para a primeira. Usar esse método acima não aconteceria (e é muito simples de usar também).
fonte
closure
, apenas preciso que funcione e isso é absolutamente aceitável, limpo, simples e não global.No mundo de hoje, há uma outra resposta mais limpa e extraída de outra resposta do Stack Overflow:
Aqui está a pergunta e resposta originais: jQuery HOW TO ?? passar parâmetros adicionais ao retorno de chamada bem-sucedido para a chamada $ .ajax?
fonte
Você também pode tentar algo como o seguinte:
fonte
Você pode usar um fechamento do JavaScript:
e quando você pode fazer:
fonte
Cometi um erro no último post. Este é um exemplo prático de como passar argumentos adicionais na função de retorno de chamada:
fonte
Vamos simples! :)
fonte
Uma solução mais geral para enviar solicitações assíncronas usando a
.ajax()
API jQuery e fechamentos para passar parâmetros adicionais para a função de retorno de chamada:fonte
Para mim e para outros iniciantes que acabaram de entrar em contato com Javascript,
acho que isso
Closeure Solution
é meio confuso demais.Enquanto eu descobri isso, você pode facilmente passar quantos parâmetros quiser para cada retorno de chamada ajax usando jquery.
Aqui estão duas soluções mais fáceis .
Primeiro, que o @zeroasterisk mencionou acima, exemplo:
Segundo, passe dados auto-definidos adicionando-os ao
XHR object
que existem em toda a vida útil do ajax-request-response.Como você pode ver, essas duas soluções têm uma desvantagem: você precisa escrever um pouco mais de código a cada vez do que apenas escrever:
Leia mais sobre $ .ajax: http://api.jquery.com/jquery.ajax/
fonte
Se alguém ainda vier aqui, esta é minha opinião:
O que acontece aqui, após a ligação à função de retorno de chamada, ela estará disponível na função como
this
.Essa ideia vem de como o React usa a
bind
funcionalidade.fonte
Maneira secundária:
fonte
na verdade, seu código não está funcionando porque quando você escreve:
você coloca uma chamada de função como o terceiro parâmetro em vez de uma referência de função .
fonte
Como um adendo à resposta de b01 , o segundo argumento de
$.proxy
é frequentemente usado para preservar athis
referência. Os argumentos adicionais passados para$.proxy
são aplicados parcialmente à função, preenchendo-a previamente com dados. Observe que qualquer argumento$.post
transmitido para o retorno de chamada será aplicado no final, portanto,doSomething
deve haver aqueles no final de sua lista de argumentos:Essa abordagem também permite que vários argumentos sejam vinculados ao retorno de chamada:
fonte