Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript > Bibliothèques & Frameworks > Prototype & Script.aculo.us
Prototype & Script.aculo.us Forum d'entraide sur les frameworks Prototype et Script.aculo.us
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/11/2007, 09h04   #1
Membre du Club
 
Homme Jonathan
Inscription : avril 2007
Messages : 274
Détails du profil
Informations personnelles :
Nom : Homme Jonathan

Informations forums :
Inscription : avril 2007
Messages : 274
Points : 57
Points : 57
Par défaut [Prototype] Ajax.request => Plusieurs requête à la suite

Bonjour à tous,

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

Code :
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 ?
Jonathan.b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2007, 09h16   #2
Membre habitué
 
Inscription : septembre 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 169
Points : 116
Points : 116
Dans ta fonction test, tu fais appel à ta 2eme request.
Ex :
Code :
1
2
3
4
5
6
7
8
9
10
function test () {
  // tes trucs
 
  new Ajax.Request(URL2 , 
{ 
	method : 'get' , 
	onComplete: test2
})
 
}
__________________
Cartes Pokémon, Yugioh, Magic ?
Communauté d'échange
kangaxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2007, 10h07   #3
Membre du Club
 
Homme Jonathan
Inscription : avril 2007
Messages : 274
Détails du profil
Informations personnelles :
Nom : Homme Jonathan

Informations forums :
Inscription : avril 2007
Messages : 274
Points : 57
Points : 57
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?
Jonathan.b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2007, 11h54   #4
Membre habitué
 
Inscription : septembre 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 169
Points : 116
Points : 116
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 :
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();
  }
}
kangaxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2007, 12h02   #5
Membre du Club
 
Homme Jonathan
Inscription : avril 2007
Messages : 274
Détails du profil
Informations personnelles :
Nom : Homme Jonathan

Informations forums :
Inscription : avril 2007
Messages : 274
Points : 57
Points : 57
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...
Jonathan.b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2007, 13h38   #6
Membre habitué
 
Inscription : septembre 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 169
Points : 116
Points : 116
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 :
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.
kangaxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2007, 17h13   #7
Membre du Club
 
Homme Jonathan
Inscription : avril 2007
Messages : 274
Détails du profil
Informations personnelles :
Nom : Homme Jonathan

Informations forums :
Inscription : avril 2007
Messages : 274
Points : 57
Points : 57
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....?
Jonathan.b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2007, 17h40   #8
Membre habitué
 
Inscription : septembre 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 169
Points : 116
Points : 116
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 :
setTimeout("load()",100));
Ca devrait suffir.

Après j'ai pas testé, donc à voir si ca marche réellement.
kangaxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2007, 12h19   #9
Membre du Club
 
Homme Jonathan
Inscription : avril 2007
Messages : 274
Détails du profil
Informations personnelles :
Nom : Homme Jonathan

Informations forums :
Inscription : avril 2007
Messages : 274
Points : 57
Points : 57
Merci pour tous ces conseils. Je ne peux pas tester tout ca tout de suite mais en gros, la fonction ressemblera à ca?

Code :
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.
	}
}
Jonathan.b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2007, 12h40   #10
Membre habitué
 
Inscription : septembre 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 169
Points : 116
Points : 116
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 :
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".
kangaxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2007, 15h57   #11
Membre du Club
 
Homme Jonathan
Inscription : avril 2007
Messages : 274
Détails du profil
Informations personnelles :
Nom : Homme Jonathan

Informations forums :
Inscription : avril 2007
Messages : 274
Points : 57
Points : 57
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?
Jonathan.b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2007, 16h05   #12
Membre habitué
 
Inscription : septembre 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 169
Points : 116
Points : 116
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.
kangaxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2007, 18h07   #13
Membre confirmé
 
Inscription : 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 : 271
Points : 271
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...
__________________
Conception et hébergement de votre site Web : http://www.jvprod.fr !
jeje13009 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2007, 16h58   #14
Membre du Club
 
Homme Jonathan
Inscription : avril 2007
Messages : 274
Détails du profil
Informations personnelles :
Nom : Homme Jonathan

Informations forums :
Inscription : avril 2007
Messages : 274
Points : 57
Points : 57
Bonjour,

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

Je rencontre une première erreur :

Code :
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é ?
Jonathan.b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2007, 10h14   #15
Membre habitué
 
Inscription : septembre 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 169
Points : 116
Points : 116
Salut, je viens de tester, ce code marche :
Code :
1
2
3
tab = new Array();
tab[0] = function () { alert('titi'); }
tab[0]();
Peut etre fais tu différement ?
kangaxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2007, 10h23   #16
Membre habitué
 
Inscription : septembre 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 169
Points : 116
Points : 116
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 :
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
kangaxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2007, 10h51   #17
Membre du Club
 
Homme Jonathan
Inscription : avril 2007
Messages : 274
Détails du profil
Informations personnelles :
Nom : Homme Jonathan

Informations forums :
Inscription : avril 2007
Messages : 274
Points : 57
Points : 57
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')"...
Jonathan.b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2007, 14h24   #18
Membre habitué
 
Inscription : septembre 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 169
Points : 116
Points : 116
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.
kangaxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h25.


 
 
 
 
Partenaires

Hébergement Web