¿Hay alguna manera de pasar más datos a una función de devolución de llamada en jQuery?
Tengo dos funciones y quiero que la devolución de llamada a $.post
, por ejemplo, pase los datos resultantes de la llamada AJAX, así como algunos 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) {
}
Quiero poder pasar mis propios parámetros a una devolución de llamada, así como el resultado devuelto por la llamada AJAX.
Respuestas:
La solución es la unión de variables a través del cierre.
Como un ejemplo más básico, aquí hay una función de ejemplo que recibe y llama a una función de devolución de llamada, así como una función de devolución de llamada de ejemplo:
Esto llama a la devolución de llamada y proporciona un único argumento. Ahora desea proporcionar un argumento adicional, de modo que cierre la devolución de llamada.
O, más simplemente, usando las funciones de flecha ES6 :
En cuanto a su ejemplo específico, no he usado la
.post
función en jQuery, pero un análisis rápido de la documentación sugiere que la devolución de llamada debería ser un puntero de función con la siguiente firma:Por lo tanto, creo que la solución es la siguiente:
¿Qué está pasando?
En la última línea,
doSomething(extraStuff)
se invoca y el resultado de esa invocación es un puntero de función .Porque
extraStuff
se pasa como un argumentodoSomething
está dentro del alcance de ladoSomething
función.Cuando
extraStuff
se hace referencia en la función interna anónima devueltadoSomething
, está vinculada por el cierre alextraStuff
argumento de la función externa . Esto es cierto incluso después de quedoSomething
haya regresado.No he probado lo anterior, pero he escrito un código muy similar en las últimas 24 horas y funciona como lo describí.
Por supuesto, puede pasar múltiples variables en lugar de un solo objeto 'extraStuff' dependiendo de sus preferencias personales / estándares de codificación.
fuente
Cuando se usa
doSomething(data, myDiv)
, realmente llama a la función y no hace referencia a ella.Puede pasar la
doStomething
función directamente, pero debe asegurarse de que tenga la firma correcta.Si desea mantener doSomething como está, puede ajustar su llamada en una función anónima.
Dentro del código de función anónimo, puede usar las variables definidas en el alcance adjunto. Esta es la forma en que funciona el alcance de Javascript.
fuente
return function(...){...}
función adicional dentro de ladoSomething
función. Encontré otro ejemplo claro del mismo concepto aquí: theelitist.net/…(function(myDiv){ ... })(myDiv)
para capturar la variablemyDiv
. Esto se hace implícitamente en la respuesta @bradhouse.En realidad, es más fácil que todo el mundo lo hace sonar ... especialmente si usa la
$.ajax({})
sintaxis base frente a una de las funciones auxiliares.Simplemente pase el
key: value
par como lo haría en cualquier objeto, cuando configure su solicitud ajax ... (porque$(this)
todavía no ha cambiado el contexto, sigue siendo el desencadenante de la llamada de enlace anterior)Una de las razones por las que esto es mejor que configurar var es que var es global y, como tal, sobrescribible ... si tiene 2 cosas que pueden activar llamadas ajax, en teoría podría activarlas más rápido de lo que responde la llamada ajax, y tendrías el valor para la segunda llamada pasada a la primera. Usando este método, arriba, eso no sucedería (y es bastante simple de usar también).
fuente
closure
, solo necesito que funcione y esto es absolutamente as, limpio, simple y no global.En el mundo de hoy hay otra respuesta que es más limpia, y tomada de otra respuesta de Stack Overflow:
Aquí está la pregunta y respuesta original: jQuery ¿CÓMO? pasar parámetros adicionales a la devolución de llamada exitosa para la llamada $ .ajax?
fuente
También puedes probar algo como lo siguiente:
fuente
Puede usar un cierre de JavaScript:
y cuando puedes hacer:
fuente
He cometido un error en la última publicación. Este es un ejemplo práctico de cómo pasar argumentos adicionales en la función de devolución de llamada:
fuente
¡Vamos simples! :)
fuente
Una solución más general para enviar solicitudes asincrónicas utilizando la
.ajax()
API jQuery y los cierres para pasar parámetros adicionales a la función de devolución de llamada:fuente
Para mí y para otros novatos que acaban de contactar con Javascript,
creo que el
Closeure Solution
es un poco confuso.Si bien descubrí eso, puede pasar fácilmente todos los parámetros que desee a cada devolución de llamada ajax utilizando jquery.
Aquí hay dos soluciones más fáciles .
El primero, que @zeroasterisk ha mencionado anteriormente, ejemplo:
En segundo lugar, pase los datos autodefinidos agregándolos al
XHR object
que existe en toda la vida útil de ajax-request-response.Como puede ver, estas dos soluciones tienen un inconveniente que: necesita escribir un poco más de código cada vez que simplemente escribir:
Lea más sobre $ .ajax: http://api.jquery.com/jquery.ajax/
fuente
Si alguien todavía viene aquí, esta es mi opinión:
Lo que sucede aquí, después de vincularse a la función de devolución de llamada, estará disponible dentro de la función como
this
.Esta idea proviene de cómo React usa la
bind
funcionalidad.fuente
Forma secundaria:
fuente
en realidad, su código no funciona porque cuando escribe:
coloca una llamada de función como el tercer parámetro en lugar de una referencia de función .
fuente
Como una adición a la respuesta de b01 , el segundo argumento de
$.proxy
se usa a menudo para preservar lathis
referencia. Los argumentos adicionales pasados a$.proxy
se aplican parcialmente a la función, llenándola previamente con datos. Tenga en cuenta que cualquier argumento que$.post
pase a la devolución de llamada se aplicará al final, por lo quedoSomething
debería tenerlos al final de su lista de argumentos:Este enfoque también permite que varios argumentos se unan a la devolución de llamada:
fuente