Comment exécuter 3 fonctions simultanéments?

  • Auteur de la discussion lephenicien
  • Date de début

lephenicien

Nouveau membre
Salut à tous,

j'ai un soucis avec javascript:

au chargement de ma page je lance 3 fonctions:

<body onload="post1();post2();post3();">

pour chaque fonction il s'agit en fait d'une requête type ajax qui va poster sur 100 pages.

Le prob c'est que post2() ne va s'executer que lorsque post1() aura fini et post3() que lorsque post2() aura fini. Pas terrible pour l'optimisation du temps.

Comment est ce que je peux faire pour qu'elles s'exécutent en même temps, sans qu'une attende la fin de l'autre?

J'ai essayé au chargement de la page de lancer une fonction contenant post1();post2();post3(); mais ca marche pas non plus.


Quelqu'un a la solution?

Merci d'avance
 

zeb

Modérateur
Tiens, un autre "lephenicien" (Il existe déjà un le_phenicien sur PPC)

Je ne connais pas de solutions pour toi côté client. Mais côté serveur tu peux peut-être quelque chose en fonction du système.
 

KangOl

Grand Maître
sans le code source ca va etre dur de t'aider

ton problème est vraiment bizarre parce que AJAX est justement asynchrone...
 

Anubis_

Expert
sans le code source ca va etre dur de t'aider

ton problème est vraiment bizarre parce que AJAX est justement asynchrone...

Les implémentations de XMLHTTPRequest sont synchrones ou asynchrones, le programmeur a le choix. lephenicien, je te conseille de trouver dans la librairie JS que tu utilises comment spécifier le caracrtère synchrone ou asyncrone de ta requête.

En résumé, lorsqu'une requête est dite synchrone, l'exécution de la méthode qui lance la requête HTTP est blocante, et ne retourne qu'une fois la réponse du serveur reçue. Lorsqu'une requête est asynchrone, l'exécution de la méthode qui lance la requête HTTP n'attend pas de retour du serveur : c'est pour cela qu'il aura fallu à l'avance enregistrer un traitant, qui sera chargé de traiter la réponse a posteriori.

Pour ton problème précis, il sera nécessaire d'utiliser des requêtes asynchrones. Mais peut être pas suffisant : en effet, si l'implémentation du moteur HTTP du navigateur ne permet pas de parallelliser les requêtes, elles se feront les unes à la suite des autres, probablement dans l'ordre où eles auront été enregistrées. De mémoire, il y a un paramètre avancé de mozilla qui permet d'autoriser les requêtes HTTP simultanées et de fixer le nombre maximum de requêtes HTTP simultanées. A creuser...

Sinon, de manière programmatique, tu peux régler ton probléme autrement : si post1, post2 et post3 font des requêtes de type que j'appellerai 1, 2 et 3, au lieu de lancer 100 requêtes 1, puis 100 requêtes 2 puis 100 requêtes 3, tu peux toi même les ordonner en 100 séquences 1-2-3.

Bonne chance
 

zeb

Modérateur
Sinon, de manière programmatique, tu peux régler ton probléme autrement : si post1, post2 et post3 font des requêtes de type que j'appellerai 1, 2 et 3, au lieu de lancer 100 requêtes 1, puis 100 requêtes 2 puis 100 requêtes 3, tu peux toi même les ordonner en 100 séquences 1-2-3.
Intelligent et très élégant !
 

lephenicien

Nouveau membre
Merci pour vos réponses.

zeb LePhenicien ou Le Phenicien c'est moi même, j'avais perdu les identifiants du site et de la boite mail rattachée puis les ai retrouvé puis reperdu etc... Bref avec 2 comptes je m'en sort toujours, j'en retrouve toujours 1 des 2 ;)


Anubis_ ta réponse est super interessante.

Je vais expliquer plus en détail.
Post1() me sert à envoyer des variables précises à une page, d'où je récupère un lien hypertext puis j'effectue un get1() (toujours xmlhttprequest) sur ce lien et je récupère les données qu'il me faut.
J'efféctue donc ceci environ 100 fois.

Chaque boucle me prend env. 3s
Si je lance post1() & post2() & post3() "presque" en même temps , c'est dire par le biais de 3 boutons, sur lesquels j'aurais cliqué aussi vitre que possible, chaque boucle me prend 4s. MAIS en contre-partie j'aurais en fait efféctué 3 boucles... vous me suivez?

Comme le temps est primordial, il me faut donc 3 "instances".

Qu'est ce que vous proposez pour ceci?

Voici le code source pour les fonctions get1 et post1

function get1(lien1,id1,fgtp1,time1){
var chaine1, strResult1;
objXml1 = new ActiveXObject("Microsoft.XMLHTTP");
objXml1.open("GET", lien1, true);
objXml1.onreadystatechange=function() {
if (objXml1.readyState==4) {
var var_get1 = objXml1.responseText;
var test1 = post1("chaine"+id1+"="+var_get1+"&id"+id1+"="+id1+"&fgtp"+id1+"="+fgtp1+"&time"+id1+"="+time1);
}}
objXml1.send(null); }

function post1(variables1) {
var objHTTP1, strResult1;
objHTTP1 = new ActiveXObject('Microsoft.XMLHTTP');
objHTTP1.Open('POST',"test2.php",false);
objHTTP1.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
objHTTP1.send(variables1+"&idf=1");
strResult1=objHTTP1.responseText;
S1.value=strResult1;
eval(strResult1);
return(strResult1) }


Merci beaucoup !!
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 065
Membres
1 586 286
Dernier membre
petitangebleu1977
Partager cette page
Haut