2010-02-24 7 views
7

Así que estoy leyendo un libro en AJAX, y están hablando sobre el uso de la función interna como una forma de manejar múltiples solicitudes. Lo entiendo, pero en este trozo de código que utilizan, no entiendo cómo todavía se puede utilizar la variable XMLHttpRequestObject:¿Cómo funciona AJAX si se borra si XMLHttpRequestObject se elimina y/o no contiene ningún valor, ya que también se establece en nulo?

if(XMLHttpRequestObject) 
{ 
    XMLHttpRequestObject.open(“GET”, dataSource); 

    XMLHttpRequestObject.onreadystatechange = function() 
    { 
     if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200) 
     { 
      document.getElementById(“targetDiv”).innerHTML = XMLHttpRequestObject.responseText; 
      delete XMLHttpRequestObject; 
      XMLHttpRequestObject = null; 
     } 
    } 

    XMLHttpRequestObject.send(null); 
} 

Mi primer reparo es cuando se eliminan XMLHttpRequestObject y luego, después de que supuestamente elimina, lo configuran igual a nulo. Luego, después de que supuestamente se eliminó y se estableció en nulo, utilizan el XMLHttpRequestObject.send(null); Pero, ¿cómo se hace nada cuando XMLHttpRequestObject se elimina y/o no contiene ningún valor, ya que también se establece en nulo?

+0

me parece un error. –

Respuesta

1

Mi primer problema es cuando eliminan XMLHttpRequestObject y luego, después de supuestamente eliminarlo, lo configuran como nulo.

No sé por qué lo están haciendo. Establecer para null me parece suficiente, pero tal vez esto solucione algún oscuro capricho del navegador.

Luego, después de supuestamente eliminarlo y establecerlo en nulo, usan XMLHttpRequestObject.send (null);

no. la eliminación tiene lugar dentro del controlador de eventos; esta función de controlador de eventos no se llama hasta que se realiza la solicitud y el estado del objeto xhr cambia, por ejemplo, debido al servidor que envía la respuesta o cuando se produce un error en la comunicación.

Básicamente, la secuencia de llamada no es la misma que la secuencia declaración. La secuencia de llamada es:

XMLHttpRequestObject.open(“GET”, dataSource); 
... //assign event handler so it can be called later on 
XMLHttpRequestObject.send(null); 
... //request send, program continues 


//separate context here, goes off when the readystate of the xhr changes 
//due to server response or error: 
function() 
{ 
    if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200) 
    { 
     document.getElementById(“targetDiv”).innerHTML = XMLHttpRequestObject.responseText; 
     delete XMLHttpRequestObject; 
     XMLHttpRequestObject = null; 
    } 
} 
2

La función onreadystatechange no se ejecuta inmediatamente cuando se crea. Como su nombre indica, se llama cuando el estado cambia.

En este caso, XMLHttpRequestObject solo se elimina después de XMLHttpRequestObject.readyState == 4 y XMLHttpRequestObject.status == 200, es decir, una vez que la página se ha recibido correctamente.

+0

Ok, una vez que se recibe con éxito, ¿cómo no genera un error? Todavía establece XMLHttpRequestObject igual a nulo después de eliminarlo. ¿Las cosas son diferentes con la palabra clave delete en JS en comparación con C++ o algo así? – Justen

+0

@Justen: lo que sucede en la declaración 'delete' es que cualquier objeto al que la variable referencia con el nombre' XMLHttpRequestObject' se marque para eliminar y eventualmente se recolectará basura. La asignación 'null' solo le está dando a la variable' XMLHttpRequestObject' un nuevo valor - 'null'. Entonces, la variable 'XMLHttpRequestObject' no es lo mismo que el objeto; solo se usa para mantener la referencia a un objeto, y' delete' actúa sobre ese objeto, no sobre la variable. –

+0

Pensé que JS tenía recolección de basura? ¿Por qué la necesidad de marcar la cosa para su eliminación nosotros mismos? – Justen

0

Establece una función para llamar cuando el estado cambia. Eso no se llama inmediatamente, por lo que no está usando el objeto de inmediato.

El hecho de que pueda usar el objeto XmlHttpRequestedObject es un engaño de compilador sofisticado, básicamente, donde escribe el código feo para envolver la función y cosas variables.

+0

Por lo tanto, no lo usa al instante, pero cuando se usa , todas mis preguntas son iguales – Justen

Cuestiones relacionadas