Pregunta

He estado trabajando en un dispositivo de Windows (lo que significa que el "navegador" es Internet Explorer) que consulta las direcciones de la subred especificadas para obtener información. Ahora, a veces lo hace a un ritmo relativamente rápido (aproximadamente cada 5 segundos) y funciona lo suficientemente bien. Sin embargo, a veces se atascará en Ready State 1 y se quedará allí para siempre. Cada vez que el gadget intenta rehacer la función para obtener el xmlhttprequest y obtener información, permanecerá en el estado 1. Esto es fácilmente replicable al abrir múltiples instancias del gadget y luego cerrar todos menos uno de ellos. En ese momento, el que aún está abierto casi siempre se atascará en este estado. Siento que podría tener algo que ver con todos ellos accediendo al mismo sitio web, o puede tener que ver con XMLHTTPRequests que se detienen a mitad de transmisión y que evita que otro funcione. A continuación se muestra el código relevante.

//Reference to this for the inner function
var me = this;
var request = new XMLHttpRequest();
request.onreadystatechange = onReadyStateChange;
var url = this.url;
//Make the URL random to prevent being cached
url += ("&a=" + ((new Date()).getTime()));
Trace(DEBUG_COMM, "Sase.updateStatus url: " + url);
request.open("GET", url, true);
request.send();   // fire off the request, calls httpRequestReadyStateChange as things continue
Trace(DEBUG_COMM, "Request sent" + request.readyState); 
function onReadyStateChange() {Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: state=" + request.readyState);
    if (4 == request.readyState) {
        Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: status=" + request.status);

        if (request.status == 200) {
            Trace(DEBUG_COMM, "retrieved html: " + request.responseText);
            var results = request.responseText;
            var resultsString = request.responseText.toString();
            Trace(DEBUG_COMM, "results String: " + resultsString);
            me.ParseStatusData(resultsString);
        }
        else {
            //me.commError(request.status);
        }

        request = null;
    }
}
¿Fue útil?

Solución

Bueno, parece que lo descubrí. Tenía la sensación de que era una solicitud no resuelta, ya que solo sucede cuando las instancias de la misma están cerradas (lo que significa que si uno de ellos está cerrado mientras está en comunicación con el servidor, permanece en la comunicación para siempre y nadie más puede acceder al servidor) y Parece que ese es el caso. Hice algunas modificaciones al código en múltiples áreas y básicamente a lo que se reduce es cuando se cierra el dispositivo, se asegura de abortar todas las solicitudes. Las solicitudes ahora son variables de instancia (para permitir el aborto de ellas), pero aún se hacen nuevos cada vez que se necesitan.

Otros consejos

Para aquellos que se topan con esto y necesitan un ejemplo de código concreto, aquí van.

Tuve el mismo problema y la solución fue reutilizar el objeto XMLHTTPRequest, para asegurar que se cancelara cualquier solicitud anterior antes de iniciar una nueva. Esto no funcionará si desea tener múltiples solicitudes de Ajax volando, pero en mi caso activar una nueva solicitud significaba que la última ya no era necesaria.

Todas las solicitudes en mi página pasaron por el mismo método de envoltura XMLHTTPREQUEST que se veía así;

//Declare the XMLHttpRequest object to be re-used
var global_xHttpRequest = null;

function xmlHttpHandler(type, params, complete, postData) {

   //Prevents an issue where previous requests get stuck and new ones then fail
   if (global_xHttpRequest == null) {
       global_xHttpRequest = new XMLHttpRequest();
   } else {
       global_xHttpRequest.abort();
   }

   //Parse out current URL
   var baseURL = window.location.host;
   var svc = "https://" + baseURL + "/processAction?";

   var url = svc + params;

   global_xHttpRequest.open(type, url, true);

   //Add the callback
   global_xHttpRequest.onreadystatechange = complete;

   global_xHttpRequest.send(postData);
}

Que se puede usar así:

   xmlHttpHandler("GET", params, completeFnc);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top