Javascript XMLHttpRequest issue

J'utilise le script suivant pour vérifier si je peux me connecter à un site Web dans un intervalle régulier (10 secondes dans mon exemple de code). J'ai rencontré deux problèmes, des idées pour les résoudre?

  1. Si un site Web est très lent et aucune réponse dans les 10 secondes (rendant PingWebSite ne retourne pas), je trouve que 2 secondes d'appel à PingWebSite seront exécutées à cause de 10 secondes d'intervalle. Mon but est que je veux qu'un seul appel à PingWebSite soit en cours d'exécution, et si l'intervalle de 10 secondes arrive et que PingWebSite est en cours d'exécution, je souhaite empêcher l'exécution de PingWebSite en cours. Des idées pour résoudre ceci?

  2. Je trouve un problème étrange, lorsque je me connecte à un site Web très lent et que le chemin du code s'exécute pour "Alerte" ("connexion"); "alors j'attends que l'exception soit lancée pour le délai d'attente, mais dans mon débogage, aucune exception n'est lancée . Des idées sur la façon d'attraper l'exception de délai d'attente?

Voici mon code,

var index = 0; function setup() { window.setInterval(PingWebSite, (10 * 1000)); } function PingWebSite() { var http_request = new XMLHttpRequest(); try { http_request.open("GET", "http://www.google.com", true); http_request.onreadystatechange = function() { if (http_request.readyState == 4) { if (http_request.status == 200) { MonitorInformation.innerText = "http://www.google.com" + " Connection ok"; alert("ok"); } else { alert("fail"); } http_request = null; } // if if (http_request.readyState == 4) else { // if execute here, no exception will be thrown alert("connecting"); } } // end of function http_request.send(null); } // try catch (e) { alert("service is not available"); } } 

EDIT 1: J'ai suivi les conseils ici pour modifier mon code. Voici la version ci-dessous. Le nouveau problème est la valeur de l'index (p. Ex. 0) sera indiqué dans la boîte de message d'alerte avant la boîte de message d'alerte OK / échec. Je pense que la valeur de l'index (p. Ex. 0) devrait s'afficher dans la boîte de message d'alerte après la boîte de message d'alerte ok / fail. Quelques idées pourquoi?

 var index = 0; var http_request; var xhrTimeout; var chkConn; function setup() { chkConn = window.setInterval(PingWebSite, (10 * 1000)); } function WebMonitorTimeout() { http_request.abort(); alert("timeout"); index = index + 1; } function PingWebSite() { http_request = new XMLHttpRequest(); http_request.open("GET", "http://www.google.com", true); http_request.onreadystatechange = function() { if (http_request.readyState == 4) { if (chkConn) { clearInterval(chkConn); } if (http_request.status == 200) { alert("ok"); index = index + 1; if (xhrTimeout) { clearTimeout(xhrTimeout); } } else { alert("fail"); index = index + 1; if (xhrTimeout) { clearTimeout(xhrTimeout); } } http_request = null; } //if (http_request.readyState == 4) } // end of event function http_request.send(null); xhrTimeout = setTimeout("WebMonitorTimeout();", 30000); alert(index); chkConn = window.setInterval(PingWebSite, (30 * 1000)); } 

Merci d'avance George

Dupliquer de javascript se connecter au code du site ne fonctionne pas

Vous ne pouvez pas faire des demandes Cross Site XHR en raison de la sécurité du navigateur

Pour votre premier problème, n'utilisez pas setInterval – utilisez setTimeout dans le rappel pour votre demande:

 http_request.onreadystatechange = function () { if (http_request.readyState == 4) { // ... setTimeout(PingWebSite, 10000); } }; 

N'oubliez pas d'appeler votre fonction une fois qu'elle a été définie pour la démarrer (après que setTimeout sera appelé chaque fois qu'une fois la demande terminée).

Notez que, dans certains cas, vous ne parvenez pas à atteindre readyState 4. Je n'ai pas vraiment examiné comment les autres bibliothèques traitent ces cas, mais regardez le code source de jQuery , par exemple, pour l'inspiration.

 <SCRIPT language=javascript> // Needed for IE6 and older to replicate the standard XMLHttpRequest object if (window.ActiveXObject && !window.XMLHttpRequest){window.XMLHttpRequest = function(){progIds=new Array("Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0","Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP", "Microsoft.XMLHTTP");for(i in progIds){try{return new ActiveXObject(progIds[i]);}catch(ex){alert(progIds[i]);}}return null;};} // Standard asynchonous AJAX code var xhr = new XMLHttpRequest(); // You would normally trade out the location.href with an actual .ashx // page. It's like this here only for testing, thereby requesting this // same page back from the server. xhr.open("POST",location.href,true); // The function that will be called asynchronously when the server sends // back its response xhr.onreadystatechange=function(){ // If you're using the file system instead of a web server then xhr.status // will come back as 0, not 200. And of course if the page isn't found // then a web server will send back a status of 404. xhr.readyState is 4 // when the page is done. if (xhr.readyState == 4 && xhr.status == 200) { clearTimeout(xhrTimeout); // Looks like we didn't time out! // Use xhr.responseText to parse the server's response alert(xhr.responseText); } } // Now that we're ready to handle the response, we can make the request xhr.send("My excellent post info"); // Timeout to abort in 5 seconds var xhrTimeout=setTimeout("ajaxTimeout();",5000); function ajaxTimeout(){ xhr.abort(); alert("Well dang, the AJAX request timed out. Did you lose network "+ "connectivity for some reason?"); // Note that at this point you could try to send a notification to the // server that things failed, using the same xhr object. } </SCRIPT>