2011-04-01 8 views
6

Digamos que tengo este código en javascript:¿Cuál es la duración de una llamada de Ajax?

function doAnAjaxCall() { 
    var xhr1 = new XMLHttpRequest(); 
    xhr1.open('GET', '/mylink', true); 
    xhr1.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status==200) { 
      alert("Hey! I got a response!"); 
     } 
    }; 
    xhr1.send(null); 
} 

y dejar que el código en el servlet sea:

public class RootServlet extends HttpServlet { 
    public void doGet (HttpServletRequest req, HttpServletResponse resp) throws IOException { 
     resp.getWriter().write("What's up doc?"); 
     resp.setStatus(200); 
    } 
} 

Will xhr1 todavía esperar a nuevos cambios en readystate? ¿O se cierra tan pronto como recibe la primera respuesta? Si permanece abierto, dará lugar a pérdidas de memoria/navegador más lento después de un tiempo y la acumulación de algunos de esos? ¿Debería llamar siempre a resp.getWriter(). Close() al final del código del servlet?

Y, por último, para los aficionados jQuery por ahí:

hace $.ajax() se comportan como XMLHttpRequest() en ese sentido?

+3

Esto no responde directamente a su pregunta, pero en su ejemplo, configuró erróneamente onreadystatechange después de invocar send (null), que es un error. –

+0

Nunca pensé en eso, pero tiene mucho sentido establecer el controlador de eventos antes de enviarlo. Haré que cambie eso en mi código real. Sin embargo, nunca tuve un problema con eso. – Aleadam

Respuesta

5

¿Espera xhr1 aún esperar nuevos cambios en Readystate? ¿O se cierra tan pronto como recibe la primera respuesta? Si permanece abierto, ¿dará lugar a fugas de memoria/navegador más lento después de un tiempo y la acumulación de algunos de esos?

Detrás de escena, permanece abierto. Sin embargo, (y la ocupación de la memoria) es responsabilidad del motor del navegador web. Mantiene una cierta cantidad de conexiones en un grupo que tiene un límite máximo por dominio de todos modos. MSIE, por ejemplo, tiene un error que hace que se filtren cuando todavía están en ejecución mientras el usuario descarga (cierra) la ventana.

¿Debo siempre llamar al resp.getWriter().close() al final del código del servlet?

No es necesario. El servletcontainer lo cerrará de todos modos. Al cerrarlo usted mismo, solo se evita el riesgo de que algún código (defectuoso) en la cadena de respuesta escriba al cuerpo de la respuesta. Para más detalles, vea this answer.

Y, por último, para los aficionados jQuery por ahí: hace $.ajax() se comportan como XMLHttpRequest() en ese sentido?

Utiliza XMLHttpRequest bajo las cubiertas (sólo cuando el apoyo por el navegador; de lo contrario es el objeto MSIE ActiveX). Construye uno nuevo en cada llamada. Abra el unminified source code, Ctrl + F la función jQuery.ajaxTransport(. Todo el código de manejo de AJAX es de casi 200 loc y cubre todas las posibles correcciones de errores específicas del navegador en las que se pueda pensar.

+0

Gracias por la completa explicación. Actualizaré la publicación con algunas nuevas preguntas cortas, si no le importa echarle otro vistazo. – Aleadam

+0

De nada. ¿No encajaría eso mejor en otra pregunta? – BalusC

+0

Nueva pregunta es :) – Aleadam

Cuestiones relacionadas