2012-07-16 19 views
22

busqué stackoverflow pero tiene respuestas contradictorias:¿Reutilizar el objeto XMLHttpRequest o crear uno nuevo?

Why should I reuse XmlHttpRequest objects?

Ajax-intensive page: reuse the same XMLHttpRequest object or create new one every time?

Además, hay una recomendación sobre w3schools.com:

Si usted tiene más de una tarea AJAX en su sitio web, debe crear UNA función estándar para crear el objeto XMLHttpRequest y llamar a esto para cada tarea AJAX.

¿Por qué esta es la recomendación? En su lugar, estoy usando un objeto global XMLHttpRequest en mi página para manejar todas las tareas de Ajax.

Respuesta

6

Lo mejor es usar diferentes objetos para cada XHR que esté haciendo. Incluso si hay una forma de hacerlo, ¡evítalo! No hay problema con la creación de un nuevo objeto para cada solicitud. Si le preocupa la pérdida de memoria o algo por el estilo, no se preocupe, todos están apropiadamente GC.


Si usted tiene más de una tarea AJAX en su sitio web, debe crear una función estándar para crear el objeto XMLHttpRequest, y llamar a esto para cada tarea AJAX.

En realidad, significa que tiene una función que crea un objeto nuevo y lo devuelve cada vez que lo llama. Es algo así como:

function newXHR(){ 
    return a new instance of XHR(); 
} 
13

Has malentendido la recomendación de W3School. Voy a destacar la parte pertinente:

Si usted tiene más de una tarea AJAX en su sitio web, debe crear un estándar función para crear el objeto XMLHttpRequest, y llamar a esto para cada tarea AJAX.

Dice que utiliza una función AJAX para captar solicitudes. Esta función se ocupará de las incoherencias entre IE y otros navegadores. XMLHttpRequest en navegadores compatibles con estándares, y ActiveXObject en IE.

Recomiendo usar varios objetos XHR. Con un objeto xhr global, su aplicación solo puede tratar con una solicitud en un momento determinado. También es propenso a errores (por ejemplo, XMLHttpRequest launches multiple times without initiating the onreadystatechange function).

w3schools significaba algo así como:

function createXHR() { 
    try { 
     return new XMLHttpRequest(); 
    } catch (e) { 
     try { 
      return new ActiveXObject("Microsoft.XMLHTTP"); 
     } catch (e) { 
      return new ActiveXObject("Msxml2.XMLHTTP"); 
     } 
    } 
} 
var xhr = createXHR(); 
xhr.open('get', '/test', true); 
xhr.send(); 

Aunque es mejor crear una función que maneja las solicitudes, tales como jQuery.ajax.

+2

Creo que entendió la recomendación bastante bien, a menos que editara su pregunta desde entonces. Cita: "Estoy * en su lugar * usando un * objeto XMLHttpRequest * global" - en lugar de eso significa en oposición a la recomendación, que obviamente entendió que significaba no una sola instancia global sino varias. – nafg

2

La recomendación que resalta es decir que debe tener una FUNCIÓN que maneje AJAX, en lugar de específicamente un objeto XMLHTTPRequest.

Yo usaría una diferente para cada pregunta.

El argumento común en contra de esto se refiere a los gastos generales involucrados en la configuración de XHR. Sin embargo, esto va a ser bastante despreciable en cualquier sitio que use AJAX como estaba previsto (es decir, no como un sustituto laboral de los sockets web) y, en cualquier caso, se aplicarían muchos de los mismos gastos generales con la reutilización de un XHR. Todavía tendría que abrir la conexión, activarlo, conectar oyentes, etc.

Los navegadores varían en términos de la cantidad de pasarelas de conexión permitidas en un momento dado, por lo que depende del navegador controlar qué XHR pueden hacer qué . En otras palabras, no tiene que preocuparse por la gestión de este aspecto.

Por último, no hay nada que impida borrar manualmente los XHR después de que los haya utilizado, siempre que sean eliminables (propiedades de un objeto en lugar de variables).

Cuestiones relacionadas