2010-12-09 12 views
0

Ich habe an einem Windows-Gadget (dh der "Browser" ist Internet Explorer), die angegebene Subnetzadressen für Informationen abfragt. Jetzt macht es das manchmal in einem relativ schnellen Tempo (etwa alle 5 Sekunden) und es funktioniert gut genug. Manchmal bleibt es jedoch im Bereitschaftszustand 1 stecken und bleibt für immer dort. Immer wenn das Gadget versucht, die Funktion zum Abrufen der xmlhttprequest erneut auszuführen und Informationen von ihr zu erhalten, bleibt es bei Zustand 1. Dies ist leicht replizierbar, wenn mehrere Instanzen des Gadgets geöffnet und dann alle bis auf eine von ihnen geschlossen werden. Zu diesem Zeitpunkt wird der, der noch offen ist, fast immer in diesem Zustand stecken bleiben. Ich habe das Gefühl, dass es etwas damit zu tun haben könnte, dass alle auf die gleiche Website zugreifen, oder es könnte nur damit zu tun haben, dass xmlhttprequests mitten in der Übertragung gestoppt wird und andere daran gehindert werden, zu arbeiten. Unten ist der relevante Code.Javascript: xmlhttprequest zufällig im Bereit Status 1

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

Antwort

1

Nun, es sieht so aus, als ob ich es herausgefunden habe. Ich hatte das Gefühl, dass es eine ungelöste Anfrage war, da es nur passiert, wenn Instanzen davon geschlossen sind (das heißt, wenn eine von ihnen während der Kommunikation mit dem Server geschlossen ist, bleibt sie für immer in Kommunikation und niemand kann auf den Server zugreifen) und Es scheint, dass dies der Fall ist. Ich habe einige Änderungen am Code in mehreren Bereichen vorgenommen und im Grunde geht es darum, wenn das Gadget geschlossen wird, dass es alle Anfragen abbricht. Die Anfragen sind nun Instanzvariablen (um deren Abbruch zu ermöglichen), werden aber immer dann neu gemacht, wenn sie benötigt werden.

+1

, wie fühlen Sie sich über die Änderungen veröffentlichen und diese eine würdige Antwort zu machen? –

+1

Ziemlich unbehaglich, da ich seit fast 3 Jahren keinen Zugang mehr zu diesem Code hatte. – user535617

0

Für diejenigen, die darüber stolpern und ein konkretes Codebeispiel benötigen, hier geht's.

Ich hatte das gleiche Problem und die Lösung bestand darin, das XMLHttpRequest -Objekt erneut zu verwenden, um sicherzustellen, dass jede vorherige Anforderung abgebrochen wurde, bevor eine neue initiiert wurde. Dies funktioniert nicht, wenn Sie mehrere AJAX-Anfragen haben möchten, aber in meinem Fall eine neue Anfrage auslösen würde, bedeutet dies, dass die letzte nicht mehr benötigt wurde.

Alle Anfragen auf meiner Seite gingen durch die gleiche XMLHttpRequest-Wrapper-Methode, 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); 
} 

, die wie folgt verwendet werden kann:

xmlHttpHandler("GET", params, completeFnc);