Bonjour,
Je cherche à synchroniser une requete ajax asynchrone. Et je prend une grosse suée.
Je fais appel de manière cyclique à une requete ajax en mode asynchrone.
mode cyclique parce que je relance la requete tant que la reponse ne contient pas ce qu'il faut.
mode asynchrone parce que c'est le seul mode ou abort est utilisable (et ou ça ne bloque pas le navigateur pendant les requetes)
Mais ! il faut aussi que je puisse stopper (abort) la requete si la réponse ne vient pas au bout d'un certain temps (timeout du cycle des requetes).
Je cherche à avoir une fonction du genre
while(!ready) {
getDom(url);
}
où getDom(url) lance un cycle de requete ajax jusqu'à obtention de la reponse voulue ou que le timeout soit ecoulé.
De sorte que l'execution boucle (d'ou l'idee de synchroniser) sur ce getDom sans bloquer le reste. Suis-je clair ?
pour avoir une petite idée du contexte :
<html>
<head>
<title>is my datas ready ?</title>
</head>
<body>
<input type="text" id="x1" size="40">
<input type="text" id="y1" size="40">
<input type="text" id="z1" size="40">
<button type="button" onclick="abort()">stop</button>
<script type="text/javascript">
/* XMLHttpRequest */
var xhr = false;
var url = "test.xml";
var ie = false;
// branch for native XMLHttpRequest object
if(window.XMLHttpRequest && !(window.ActiveXObject)) {
try {
xhr = new XMLHttpRequest();
} catch(e) {
xhr = false;
}
// branch for IE/Windows ActiveX version
} else if (window.ActiveXObject) {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
ie = true;
} catch(e) {
try {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
ie = true;
} catch(e) {
xhr = false;
}
}
}
received = false;
function getContents () {
if(xhr.readyState == 4 && xhr.status == 200) {
response = xhr.responseXML;
if (response) {
value = ie ?
response.getElementsByTagName("status")[0].text :
response.getElementsByTagName("status")[0].textContent;
document.getElementById("z1").value = value;
setTimeout("get()", 1000);
}
}
}
function get () {
if (xhr) {
xhr.open("GET", url, true);
xhr.send("");
}
}
function abort() {
xhr.abort();
document.getElementById("z1").value='aborted';
}
xhr.onreadystatechange = getContents;
var debut = new Date();
get();
fini = false;
function f() {
var now = new Date();
document.getElementById("x1").value = now;
var elapsed = now.getTime() - debut.getTime();
document.getElementById("y1").value = elapsed;
fini = elapsed > 5000;
if (fini) abort();
else setTimeout("f()", 100);
}
f();
</script>
</body>
</html>
le xml (en fait la il n'y a pas ok mais not ok mais un jour il y aura ok a la place):
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<status>not ok</status>
</root>
si quelqu'un a une piste de reflexion, merci.