IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Destruction d'objet ajax qui ne répond pas


Sujet :

AJAX

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut [AJAX] Destruction d'objet ajax qui ne répond pas
    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 :
    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;
    }
    l'appel ajax :
    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;
    	}
    }
    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
     
    function handleResponse_prix_ajax(){
    	if(http.readyState == 4){
    		// mon traitement de la réponse...
    	} else if(http.readyState == 1){
    		setTimeout('gestion_timeout()','20000');
    	}
    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
    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...
    	}
    }

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Salut,

    Tout d'abord, tu ne transmet pas ton objet http à tes différentes fonctions, donc elles n'y ont pas accès et ne peuvent pas le manipuler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http.onreadystatechange = function(){handleResponse_prix_ajax(http);}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function handleResponse_prix_ajax(http){
    Ensuite, ton setTimeout est erroné, le 2e paramètre attend un entier et tu lui mets une chaîne...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout('gestion_timeout(http)',20000);
    à noter qu'une meilleure notation serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout(function(){gestion_timeout(http)},20000);
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci de votre réponse rapide. Je vois que je n'ai pas préciser assez de chose.

    Mes fonctions marche bien dans le sens où j'ai 99% du temps une réponse, c'est juste pour certaines requetes, le webservice est trop long à répondre et c'est la que je veux faire autrement.

    Quelques précisions :
    Tout d'abord, tu ne transmet pas ton objet http à tes différentes fonctions, donc elles n'y ont pas accès et ne peuvent pas le manipuler
    En fait je ne le transmets pas à mes fonctions parce que l'objet est une variable global je le creer sans mettre "var" devant il est donc global et donc accessible à toutes mes fonctions

    Ensuite, ton setTimeout est erroné, le 2e paramètre attend un entier et tu lui mets une chaîne.
    En effet c'est une grossière erreur de ma part, que je ne commets pas d'habitude (si si je le jure ;-) ) mais qui en l'espèce fonctionne quand même, je m'empresse de le modifier dans mon code illico.

    Donc les remarques que tu viens de faire n'ont pas de rapport avec mon problème malheureusement :-(



    ps:
    setTimeout(function(){gestion_timeout(http)},20000);
    je ne connaissais pas cette notation

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Solution
    J'ai trouvé une solution finalement. Le timeout n'étant pas gérer pour les objets xmlhttprequest, je mets donc un timeout sur mon script php chargé de récupérer les prix avec un webservice et renvoyer le résultat a mon objet. Si le script php est trop long à l'exécution, il est arrêté automatiquement et donc l'objet "ajax" passe à l'état 4 et donc je fait un traitement particulier à ce moment là et je recharge ma page avec des paramètres différents.

    J'ai donc une solution à mon problème, mais je ne comprends toujours pas pourquoi quand je faisais un objet.abort, je ne pouvais toujours pas recharger ma page, comme si l'objet continuait toujours à occuper les ressources de mon navigateur. Donc je souhaiterais toujours avoir une explication à mon problème initiale.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    ... Je crois que je me suis malheureusement emballé, ça ne fonctionne pas vraiment, quand je mets le timeout à 5 secondes ça fonctionne et quand je le mets à 15 secondes ça ne fonctionne plus, je ne comprends vraiment pas ....

    Je mets un timeout avec l'option ini_set('default_socket_timeout', 15); j'ai aussi essayé set_time_limit(15);

    ....

Discussions similaires

  1. [AJAX] Fonction $.ajax qui ne répond pas
    Par sub_zero dans le forum jQuery
    Réponses: 2
    Dernier message: 16/01/2015, 12h18
  2. [AJAX] [Scriptaculous] Déclaration objet Ajax/Scriptaculous
    Par barnabe-est dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/09/2007, 08h42
  3. Réponses: 5
    Dernier message: 08/08/2007, 12h35
  4. [VB.NET]Form qui ne répond pas
    Par Pocel dans le forum Windows Forms
    Réponses: 5
    Dernier message: 17/07/2006, 10h42
  5. [AJAX] initialisé un objet ajax?
    Par xtaze dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 17/05/2006, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo