Bonjour, mon problème est le suivant.
Je récupère en ajax les prix des produits d'un catalogue, par l'intermédiaire d'un webservice. Parfois le webservice est long à répondre (plus d'une minute) et donc l'objet ajax ne passe pas à l'état 4 (objet.readyState==4). Je veux donc que si au bout de 20 secondes le webservice n'a pas répondu, donc que l'objet n'est pas dans l'etat 4, je voudrais détruire l'objet en question pour en créer un autre qui me récupère d'autre prix aussi en ajax mais cette fois ci dans ma base de données et la je sais que ça réponds. Pour cela j'ai fait une fonction appeler avec un setimeout de 20 secondes qui regarde l'état de l'objet et s'il n'est pas dans l'état 4, je le détruit et j'en récréer un autre qui ira cherche dans ma base toujours par l'intermédiaire d'un script php. Le problème c'est qu'a priori, l'objet n'est pas détruit, le script "travail toujours" et donc il n'y a aucun changement sur ma page, car il se passe 2 minutes avant l'envoi du 2ieme objet. J'ai essayé même en détruisant l'objet puis en rechargeant la page avec des params différents mais la page ne se recharge qu'au bout de 2 minutes, le temps je suppose que mon navigateur libère sa mémoire ou ses ressources (même comportement sous ie et ff). On dirait que mon navigateur ne fait rien tant que l'autre objet n'est pas détruit par le navigateur ou tant que l'état ne passe pas à 4.
J'ai regardé les états successif de l'objet il passe de 1 puis une 20aine de seconde plus tard il passe directement à l'etat 4 sans passé par l'état 2 et 3, ce que je ne comprends pas mais je ne sais pas si c'est la cause du probleme.
Toujours est-il que mon problème n'est pas résolu, dans tous les cas je voudrais pouvoir lancer une nouvelle requete ou recharger la page au bout de 20 secondes ce qui m'est impossible.
Si quelqu'un avait une solution ou une idée ? Merci d'avance
J'espère avoir été assez explicite.
La création de mon objet :
l'appel ajax :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 function createRequestObject(){ var ro; var browser = navigator.appName; if(browser == "Microsoft Internet Explorer"){ ro = new ActiveXObject("Microsoft.XMLHTTP"); } else { ro = new XMLHttpRequest(); } return ro; }
La fonction de traitement de la réponse avec l'appel setimeout :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 function recup_prix_ajax(url, params){ adr_script = url+'?'+params; http = createRequestObject(); if(http.readyState == 4 || http.readyState == 0){ http.open('POST',url,true); http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http.setRequestHeader("Content-length", params.length); http.setRequestHeader("Connection", "close"); http.onreadystatechange = handleResponse_prix_ajax; http.send(params); return true; } }
Ma fonction qui crée l'autre objet s'il n'y a pas de réponse au bout de 20 seconde:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 function handleResponse_prix_ajax(){ if(http.readyState == 4){ // mon traitement de la réponse... } else if(http.readyState == 1){ setTimeout('gestion_timeout()','20000'); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 function gestion_timeout(){ if(http.readyState != 4){ http.abort(); // j'ai aussi essayé ça -> http = null; // et aussi ça -> http = createRequestObject(); // et aussi ça -> delete(http); // et aussi ça -> self.location.replace("mon url avec param différent"); mais la page ne se recharge qu'au bout de 2 minutes environ. //appel d'un autre fonction qui crée un autre objet recup_prix_ajax2(mes params); // mais pareil j'ai au réponse mais qu'au bout de 2 minutes... } }
Partager