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

JavaScript Discussion :

[AJAX] requète AJAX en boucle


Sujet :

JavaScript

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut [AJAX] requète AJAX en boucle
    bonjour,

    Pour faire tourner en boucle une appli Ajax asynchrone, j'utilise setTimeout que je lance dès que je reçois la réponse de ma requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	if(xhr.readyState == 4 && ajax.Req.status == 200) {
    		...
                    ...
     
    		xhr.onreadystatechange = null
    		xhr.abort()
    	        xhr = null
     
    		setTimeout(function(){makeReq()},delayReq*1000)
    	}
    => j'utilise cette méthode pour avoir l'état d'un appareil

    => je voudrais aussi que l'utilisateur puisse lancer manuellement des requètes pour donner des ordres à l'appareil. Donc j'ai créé un bouton qui lance cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function sendAction(){
    	if (xhr){
                    xhr.onreadystatechange = null
    		xhr.abort()
    	        xhr = null
            }
     
    	makeReq(postvalue)
    }
    makeReq(postvalue) créer une requète xhr => si postvalue est vide, je crée une requete xhr avec la methode GET sinon je crée une requète xhr avec la methode POST + la valeur de postvalue.

    => le problème avec cette methode, c'est que ça crée des doublon d'appel de setTimeout ce qui réduit le temps de rafraichissement des infos (ce que je ne veux pas) => il y a des setTimeout qui tournent en même temps.
    Comment faire pour résoudre mon problème ?

    est-il possible de savoir si un setTimeout sur la fonction makeReq est actif ?

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    tu peux identifier tes setTimeout() par un handler (comme les fenêtres, par ex.).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (!timer_observ)
    timer_observ = setTimeout(function(){makeReq()},delayReq*1000);
    Tu pourras ainsi identifier tes setTimeout() d'observation et ceux de commandes ...
    Tu peux également passer un paramètre à ta fonction makeReq() : pour l'observation tu utilises setTimeout() et pour les commandes (à ne lancer qu'une fois, a priori), tu fais ton appel sans setTimeout() => plus de conflit.

    Sinon, pour l'observation, un setInterval() serait plus approprié (que setTimeout() récursif)

    A+
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    j'ai fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	if(xhr.readyState == 4 && ajax.Req.status == 200) {
    		...
                    ...
     
    		xhr.onreadystatechange = null
    		xhr.abort()
    	        xhr = null
     
    		if (ObjSetTimeout==0){
    				ObjSetTimeout = setTimeout(function(){makeReq()},delayReq*1000)
    			}
    	}
    au debut de ma fonction makeReq, je mets :
    ObjSetTimeout est défini en global

    je ne différencie pas les requêtes manuelles et automatiques => tout ce que je veux c'est que s'il y a setTimeout qui va s'enclencher, qu'un autre ne s'active pas.
    => mais ça ne marche pas

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  5. #5
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    ça ne change rien ....

  6. #6
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    c'est bon j'ai trouvé

    donc dans ma reception de requète ajax, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	if(xhr.readyState == 4 && ajax.Req.status == 200) {
    		...
                    ...
     
    		xhr.onreadystatechange = null
    		xhr.abort()
    	        xhr = null
     
    		ObjSetTimeout = setTimeout(function(){makeReq()},delayReq*1000)
     
    	}
    et au debut de ma fonction makeReq(), je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	if (ObjSetTimeout){
    		clearTimeout(ObjSetTimeout)
    	}
    ObjSetTimeout doit etre declaré en global

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut


    A+
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête ajax avec $.ajax()
    Par student_php dans le forum jQuery
    Réponses: 4
    Dernier message: 30/10/2011, 19h39
  2. [AJAX - PHP] Lancer des requêtes dans une boucle
    Par Psycadi dans le forum AJAX
    Réponses: 12
    Dernier message: 01/07/2010, 16h05
  3. [AJAX] Ajax requêtes multiples
    Par Teufboy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/08/2006, 18h23
  4. [AJAX] requéte sur un domaine différent
    Par remyli dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/08/2006, 14h35
  5. [AJAX] requète sql dans js
    Par cheers94wow dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/05/2006, 13h24

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