2010-12-11 19 views
34

Cuál se utilizará en ese momento.jquery :: ajaxStop() versus jquery :: ajaxComplete()

En la documentación sobre http://api.jquery.com/:

Para ajaxStop() que dice:

Descripción: El registro de un manejador a ser llamado cuando todas las peticiones Ajax han completado. Este es un Evento Ajax.

Y para el ajaxComplete() que dice:

Descripción: registrar un controlador que se llamará cuando peticiones Ajax completa. Este es un Evento Ajax.

Por lo que puedo ver ajaxComplete() es más flexible debido a:

Todos los manipuladores ajaxComplete se invocan, independientemente de lo que se completó petición Ajax. Si debemos diferenciar entre las solicitudes, podemos usar los parámetros pasados ​​al controlador. Cada vez que se ejecuta un controlador ajaxComplete, se pasa el objeto de evento, el objeto XMLHttpRequest y el objeto de configuración que se utilizó en la creación de la solicitud.

¿Puede alguien explicar para qué sirve cada uno y el uso apropiado de cada uno? En una aplicación que construí recientemente, confié en ajaxStop() para disparar cuando terminaron mis llamadas ajax. Entonces analizaría los datos devueltos para el resultado de la operación del lado del servidor. Ahora estoy empezando a preguntarme si debería haber usado ajaxComplete() en su lugar o una combinación de ambos para diversas situaciones.

Se agradecen los pensamientos.

+0

No pude entender por qué estaba obteniendo el error 'ajaxComplete no es una función'. Asegúrese de no utilizar la versión 'delgada' de jQuery: https://stackoverflow.com/a/35424465/470749 – Ryan

Respuesta

54

Bueno, la versión corta es que sirven para diferentes propósitos, por lo que la respuesta sería "una combinación de ambos para diversas situaciones" opción. Las reglas básicas son:

  • .ajaxComplete() - tiene una duración de cada petición que completa, utilice esta opción cuando desee hacer algo con cada solicitud/resultado. Tenga en cuenta que esto no reemplaza el controlador success, ya que los datos analizados no son uno de los argumentos (y se ejecuta incluso cuando hay un error) - en su lugar, puede querer .ajaxSuccess() en algunas situaciones por solicitud.
  • .ajaxStop() - se ejecuta cuando cada lote de solicitudes completa, por lo general tendrá que utilizar esto en combinación con .ajaxStart() para cosas como mostrar/ocultar un "Cargando ..." indicador de algún tipo - o para hacer otra cosa una vez El lote de solicitudes AJAX finaliza, como un último paso maestro.

Si está usando esto para analizar sus datos, es probable que haya una mejor manera, en este caso $.ajaxSetup(), donde se puede especificar un manejador de success que obtiene los datos analizados ya-(por ejemplo, las respuestas JSON serán objetos) , como este:

$.ajaxSetup({ 
    success: function(data) { 
    //do something with data, for JSON it's already an object, etc. 
    } 
}); 
+0

Recibo la llamada de éxito de Ajax. ¿Cuándo debería usar ajaxStop versus complete? – Chris

+8

@Chris - '.ajaxStop()' se activa cuando se completa un lote de solicitudes, lo que significa que si activa 5, no importa en qué orden vuelvan, se dispara cuando finaliza la 5ª, por lo que no hay solicitudes AJAX esperando resultados en ese punto, has terminado. Esto significa que no tiene ninguna información sobre la solicitud específica que se completó, porque no era * para * una solicitud, era para todos ellos. 'ajaxComplete' dispara para * cada * solicitud, con el objeto' XMLHttpRequest' para cada ... por lo que tienes algo de información sobre la solicitud a tratar ... todo depende de lo que estás haciendo en realidad y cuál es el apropiado . –

+0

Gracias, eso tiene sentido. – Chris

7

ajaxComplete se llama siempre que finalice una solicitud de Ajax, ya sea con éxito o con un error.

ajaxStop se llama cuando todos solicitudes ajax completas. Por lo tanto, a diferencia de ajaxComplete, no se llamará si todavía hay una solicitud en progreso.

Debe usar la primera si la operación que desea realizar debe realizarse para cada solicitud de Ajax.

3

En general, desea utilizar ajaxComplete. Esto se debe a que ajaxStop solo se activará cuando ya no haya más solicitudes ajax esperando a volver. Esto puede no parecer diferente cuando está enviando una solicitud ajax a la vez, pero imagine que la red se ralentizó después de enviar la solicitud A y, cuando la solicitud B se envía 5 segundos después, regresa antes que la solicitud A ... .Entonces ajaxStop solo se activará una vez después de que la solicitud A devuelva, mientras que ajaxComplete se activará en ambas ocasiones.

La situación en la que usaría ajaxStop es cuando envía varias solicitudes de ajax de una vez ... p. para enviar una serie de 3 formularios ... y desea recibir una notificación cuando los 3 se completen correctamente. Por supuesto, se puede conseguir la misma funcionalidad con un contador dentro ajaxComplete

Sin embargo, a partir de los sonidos de su pregunta ... desea analizar los datos de cada respuesta Ajax ... normalmente esto se haría en el devolución de llamada de éxito ajax, por ejemplo

$.ajax({ 
    url: "blah", 
    data: "blah", 
    success: function (data) { /* Code in here */ } 
});