Frage

Ich habe an einem Windows -Gadget gearbeitet (dh der "Browser" ist Internet Explorer), in dem angegebene Subnetzadressen nach Informationen abfragen. Jetzt macht es dies manchmal relativ schnell (ungefähr alle 5 Sekunden) und es funktioniert gut genug. Manchmal bleibt es jedoch im Ready State 1 und bleibt für immer dort. Immer wenn das Gerät versucht, die Funktion zu wiederholen, um das XMLHTTPrequest zu erhalten und Informationen davon zu erhalten, bleibt es in Status 1. Dies ist leicht zu replizierbar, wenn Sie mehrere Instanzen des Geräts öffnen und dann alle bis auf eines von ihnen schließen. Zu diesem Zeitpunkt wird derjenige, der noch offen ist, fast immer in diesem Zustand stecken bleiben. Ich habe das Gefühl, dass es möglicherweise etwas damit zu tun hat, dass sie alle auf die gleiche Website zugreifen, oder es hat möglicherweise nur damit zu tun, dass XMLHTTPrequests mitten in der Mitte der Übertragung gestoppt werden und die Verhinderung eines anderen daran gehindert haben. Unten ist der entsprechende Code.

//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;
    }
}
War es hilfreich?

Lösung

Nun, es sieht so aus, als hätte ich es herausgefunden. Ich hatte das Gefühl, dass es sich um eine ungelöste Anfrage handelte, da es nur dann passiert, wenn Fälle geschlossen sind (was bedeutet, dass eine von ihnen in der Kommunikation mit dem Server geschlossen ist, es für immer in der Kommunikation bleibt und niemand sonst auf den Server zugreifen kann) und Es scheint, dass dies der Fall ist. Ich habe in mehreren Bereichen einige Änderungen am Code vorgenommen, und im Grunde genommen ist es, wenn das Gadget schließt, dass er alle Anfragen abbricht. Die Anfragen sind jetzt Instanzvariablen (um sie abzubrechen), werden aber immer noch jedes Mal neu gemacht, wenn sie benötigt werden.

Andere Tipps

Für diejenigen, die darüber stolpern und ein konkretes Codebeispiel benötigen, gehen Sie hier.

Ich hatte das gleiche Problem und die Lösung bestand darin, das XMLHTTPrequest-Objekt wiederzuverwenden, um sicherzustellen, dass eine frühere Anfrage vor dem Einlösen eines neuen Antrags storniert wurde. Dies funktioniert nicht, wenn mehrere AJAX -Anfragen herumfliegen möchten, aber in meinem Fall eine neue Anfrage ausführte, bedeutete die letzte, dass die letzte nicht mehr benötigt wurde.

Alle Anfragen auf meiner Seite haben dieselbe XMLHTTPrequest -Wrapper -Methode durchgeführt, die so aussah;

//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);
}

Was so verwendet werden kann:

   xmlHttpHandler("GET", params, completeFnc);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top