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

Bibliothèques & Frameworks Discussion :

Ajax.request => Plusieurs requêtes à la suite [Prototype]


Sujet :

Bibliothèques & Frameworks

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut Ajax.request => Plusieurs requêtes à la suite
    Bonjour à tous,

    Je souhaiterais savoir s'il est possible d'executer plusieurs ajax.request les unes à la suite des autres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    new Ajax.Request(URL , 
    { 
    	method : 'get' , 
    	onComplete: test
    })			
     
    new Ajax.Request(URL2 , 
    { 
    	method : 'get' , 
    	onComplete: test2
    })
    Pour l'instant mes requêtes s'executent en même. Comment changer cette situation ?

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Dans ta fonction test, tu fais appel à ta 2eme request.
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function test () {
      // tes trucs
     
      new Ajax.Request(URL2 , 
    { 
    	method : 'get' , 
    	onComplete: test2
    })
     
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    J'espérais une autre réponse. J'avais bien cette solution mais elle ne me convient pas.

    Si par exemple j'ai 10 fonctions "test" et que selon les évènements (chargement de la page, clique etc) je souhaite lancer dans un cas les fonctions test 1 puis 2 et 7 et dans un autre cas 3 puis 4 puis 6 puis 3, cela devient vite le bordel.

    Il n'est pas possible de faire des fonctions "génériques" (test dans cet exemple) et de créer ensuite des fonction (action1, action2 etc) qui font appel à ces fonctions test sans devoir les modifier?

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Hum dans ce cas tu pourrais essayer avec une classe qui garde un tableau des fonctions a appelé, et tu apel sa méthode de chargement qui ressemblerai plus ou moins à ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function load ()
    {
      if (Ajax.activeRequestCount != 0)
          setTimeout("load()",100));
      else
      {
         tab[0]();
         tab.remove(0);
         if (tab.length != 0)
            load();
      }
    }

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Je comprend bien ta fonction pour la première partie => si une requête est déja en cours, on relance la fonction load() jusqu'à ce que le nombre de requete soit égal à zéro.
    Cependant j'ai du mal à comprendre la deuxième partie...

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Oui excuse moi, je l'ai écris un peu rapidement. tab est en fait this.tab. Il correspond au tableau de fonctions que tu auras préalablement remplis dans ta classe avec la liste des fonctions à appeler, dans l'ordre.
    Donc ta classe à un attribut tab de type tableaux de fonctions, et une méthode load.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    this.tab[0](); // on éxecute la fonction en 1ere position du tableau
    this.tab.remove(0); // on retire la 1ere fonction du tableau(syntaxe à retrouver, je m'en rappelle plus
    if (this.tab.length != 0) // s'il reste encore des fonctions à appeler
    this.load(); // on rapelle la 1ere fonction pour lancer des qu'elle sera prete la fonction suivante.
    Plutot que de supprimer les fonctions du tableaux, tu peux aussi travailler avec un compte qui te dis quelle fonction tu dois éxécuter, et tant que ton compteur est pas plus grand que la taille du tableau, tu continues.

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Je n'ai pas encore essayé mais je ne demande si de cette manière, il ne va pas parcourir tout le tableau et lancer l'execution des fonctions toutes en même temps....?

  8. #8
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Normalement non. Au 1er appel de load, il n'y a pas de requete en cours, il va donc lancer le 1er "test" et relancer la méthode "load".
    "test" va faire une requete.
    "load" va s'éxécuter, une requete est en cours, elle va attendre, jusqu'a ce que "test" soit fini.
    "test" se finit.
    on peut alors lancer "test2", et ca recommence.

    Si jamais la requete ne part pas assez vite et qu'il a le temps de lancer la fonction suivante avant, tu peux remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout("load()",100));
    Ca devrait suffir.

    Après j'ai pas testé, donc à voir si ca marche réellement.

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Merci pour tous ces conseils. Je ne peux pas tester tout ca tout de suite mais en gros, la fonction ressemblera à ca?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    function load ()
    {
           tab[] = //mon tableau de commande
     
    	if (Ajax.activeRequestCount != 0)
    		setTimeout("load()",100));
    	else
    	{
        this.tab[0](); // on éxecute la fonction en 1ere position du tableau
    	this.tab.remove(0); // on retire la 1ere fonction du tableau(syntaxe à retrouver, je m'en rappelle plus
    	if (this.tab.length != 0) // s'il reste encore des fonctions à appeler
    	this.load(); // on rapelle la 1ere fonction pour lancer des qu'elle sera prete la fonction suivante.
    	}
    }

  10. #10
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Oui, enfin sauf que je viens de me rappeler que l'objet pose problème avec le settimeout, donc vautmieux travailler en fonction et variables simples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    tab[] = //mon tableau de commande
    function load ()
    {
    	if (Ajax.activeRequestCount != 0)
    	      setTimeout("load()",100));
    	else
    	{
                    tab[0](); // on éxecute la fonction en 1ere position du tableau
    	   tab.remove(0); // on retire la 1ere fonction du tableau(syntaxe à retrouver, je m'en rappelle plus
    	    if (tab.length != 0) // s'il reste encore des fonctions à appeler
    	       load(); // on rapelle la 1ere fonction pour lancer des qu'elle sera prete la fonction suivante.
    	}
    }
    Après, avant d'appeler ta fonction "load", tu remplis ton tableau "tab".

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Je commence tout juste l'ajax (et donc le javascrip) et je ne savais pas qu'une variable définie en dehors d'une fonction pouvait être utilisée dans une fonction.
    Est ce que cela veut dire que si je donne une valeur à la variable "chiffre" et que je me sert d'une variable qui porte le même nom dans une fonction, cela changera la valeur de ma variable chiffre?

  12. #12
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Oui, javascript n'est pas un langage très "propre".
    Le mieux est encore que tu le testes avec quelques alert et tu pourras le constater
    Si tu ne mets pas le mot clé "var" devant une définition de variables, elle sera alors global à tous tes scripts.
    Cette facon de faire n'est pas très propre(utiliser un tableau en global), mais sinon c'est assez compliqué avec la fonction settimeout.

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2007
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    slt,

    si j'ai bien compris, tu veux appeller une suite de fonctions, laquelle suite est variable en fonction de divers paramètre... c'est ca ?
    de plus, toujours si j'ai bien compris, les fonctions appelées se succèdent, cad que la 2eme fonction doit attendre que la première soit achevée pour se lancer... c'est ca ??

    au lieu de faire de l'Ajax à proprement parler, tu peux utiliser l'objet XHR en mode synchrone ; c'est à dire placer le troisième paramètre de open à false !

    autre chose, dans ta même fonction d'appel de requête, tu peux définir une fonction callback pour chacune de tes différentes requetes... et ce sont ces fonctions callback qui appeleront la prochaine requête à exécuter...

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    Je suis de retour. Je peux enfin tester tout ce dont on à parlé.

    Je rencontre une première erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tab[0] is not a function
    Il essaie de lancer la fonction se nommant tab[0] plutot que de lancer la fonction aillant pour nom, la valeur de tab[0].
    Comment jouer sur cette subtilité ?

  15. #15
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Salut, je viens de tester, ce code marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tab = new Array();
    tab[0] = function () { alert('titi'); }
    tab[0]();
    Peut etre fais tu différement ?

  16. #16
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Bon vu que j'avais déjà commencé, j'en ai profité pour terminer, il restait pas grand chose.

    Donc voila le code final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    tab = new Array();
    tab[0] = function () { alert('titi'); }
    tab[1] = function () { alert('toto'); }
     
     
    function load ()
    {
    	if (Ajax.activeRequestCount != 0)
    	    setTimeout("load()",100);
    	else
    	{
    		tab[0](); // on éxecute la fonction en 1ere position du tableau
    		tab.shift(); // on retire la 1ere fonction du tableau(syntaxe à retrouver, je m'en rappelle plus
    	    if (tab.length != 0) // s'il reste encore des fonctions à appeler
    			setTimeout("load()",100); // on rapelle la 1ere fonction pour lancer des qu'elle sera prete la fonction suivante.
    	}
    }
     
    load();
    Avant d'appeler load(), bien sur tu rempli le tableau avec les fonctions qui vont bien, je te laisse tester avec des fonctions qui font des ajax.request
    Tiens nous au courant

  17. #17
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    J'ai résolu le problème en mettant
    J'ai une autre question maintenant, completement différente.

    Est-il possible de mettre une sorte de marqueur sur une requete ajax. Un identifiant?

    Je voudrais pouvoir utiliser cette fonction "Ajax.activeRequestCount" mais seulement pour des requêtes pré-marquées.
    Quelque chose qui pourrait ressembler à cela "Ajax.activeRequestCount.ByName('lenom')"...

  18. #18
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Hum pour ca le plus simple serait de modifier prototype. Tu ajoutes une option supplémentaire à la méthode ajax.request pour lui donner le nom de sa "marque", et ensuite tu ajoutes un attribut supplémentaire(surement un tableau) pour stocker les différentes marques. Tu testeras les valeurs de ce tableau ensuite.

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

Discussions similaires

  1. [Prototype] Ajax.Request et onSuccess : appel de fonction avec plusieurs arguments
    Par gregbond dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 18/10/2012, 17h00
  2. Exécuter plusieurs requêtes à la suite
    Par FrenchFrogger dans le forum Sql*Plus
    Réponses: 2
    Dernier message: 14/10/2008, 19h16
  3. [AJAX] Enchainer plusieurs requêtes avec Ajax
    Par Bobtop dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/08/2006, 08h13
  4. plusieurs requêtes à la suite ça ne marche pas
    Par zouhenlai dans le forum Access
    Réponses: 10
    Dernier message: 30/06/2006, 17h02
  5. Réponses: 12
    Dernier message: 30/12/2005, 11h55

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