Question

Je travaille sur un gadget de Windows (ce qui signifie le « navigateur » est Internet Explorer) que les requêtes spécifiées adresses de sous-réseau pour l'information. Maintenant, il fait parfois cela à un rythme relativement rapide (environ toutes les 5 secondes) et cela fonctionne assez bien. Cependant, parfois, il sera bloquée à l'état prêt 1 et juste rester là pour toujours. Chaque fois que le gadget tente de refaire la fonction pour obtenir le XMLHttpRequest et obtenir des informations de ce qu'il reste à l'état 1. Ceci est facilement réplicables lors de l'ouverture de plusieurs instances du gadget puis fermer tout sauf l'un d'eux. À ce moment-là, celui qui est encore ouvert presque toujours se coincer dans cet état. Je me sens comme il pourrait avoir quelque chose à voir avec tous accéder au même site, ou il peut juste avoir à faire avec XMLHttpRequests être arrêté à mi-transmission et empêcher un autre de travailler. Ci-dessous le code correspondant.

//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;
    }
}
Était-ce utile?

La solution

Eh bien, il semble que je compris. J'ai eu le sentiment qu'il était une demande non résolue, car il ne se produit que lorsque des instances de celui-ci sont fermés (ce qui signifie que si l'un d'entre eux est fermé alors en communication avec le serveur, il reste en communication pour toujours et personne ne peut d'autre accéder au serveur) et il semble que est le cas. J'ai fait quelques modifications au code dans plusieurs domaines et essentiellement ce qu'il revient à dire lorsque le gadget ferme il est sûr d'annuler toutes les demandes. Les demandes sont maintenant des variables d'instance (pour permettre l'avorte d'entre eux), mais sont toujours faits nouveaux à chaque fois qu'ils sont nécessaires.

Autres conseils

Pour ceux qui trébuchent à travers cela et ont besoin d'un exemple de code concret, ici vous allez.

J'ai eu le même problème et la solution a été de réutiliser l'objet XMLHttpRequest, pour faire en sorte que toute demande précédente a été annulée avant de lancer un nouveau. Cela ne fonctionnera pas si vous voulez avoir plusieurs requêtes AJAX voler autour, mais dans mon cas le déclenchement d'une nouvelle demande signifiait que la dernière n'était plus nécessaire.

Toutes les demandes sur ma page est passé par la même méthode d'emballage XMLHttpRequest qui ressemblait à ceci:

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

Ce qui peut être utilisé comme ceci:

   xmlHttpHandler("GET", params, completeFnc);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top