Plusieurs requêtes ajax en même temps

Elfeez Messages postés 36 Statut Membre -  
Elfeez Messages postés 36 Statut Membre -
Bonjour à tous,
Je cherche à lancer avec Ajax un script long à exécuter, et à l'aide d'une deuxième fonction informer l'utilisateur de l'avancement du script.
Il faut donc :
- que je lance le script avec une première requête ajax
- que je lance une fonction qui contient une deuxième requête ajax, qui va récupérer l'avancement du script (grâce à un fichier texte mis à jour régulièrement par le script principal)
- si l'avancement n'est pas de 100%, la fonction de vérification repart

J'ai donc pensé à ceci :

$(function() {
//Fonction qui vérifie l'avancement du script
function checkAvancement () {
$.ajax({
url: "avancement.php",
type: "POST"
}).done(function (data) {
alert(data);
//Si l'avancement n'est pas à 100%, cette fonction est relancée
if(data != 100) {
setTimeout(checkAvancement(), 1);
}
});
}

//Au clic :
$('#lien_demarrer').click(function () {
//Le lien est caché
$('#p_demarrer').hide();
//Lancement de la vérification qui vérifie l'avancement du script
setTimeout(checkAvancement(), 100);
//Lancement du script
$.ajax({
url: "ajout.php",
type: "POST"
}).done(function (data) {
alert(data);
});
return false;
});
});


Le problème est que la fonction
checkAvancement ()
se lance une première fois au tout début, ensuite ne fait plus rien tant que le script principal n'est pas terminé, et se ré-exécute une fois qu'il est fini. En gros le navigateur n'exécute pas les 2 fonctions en même temps.

Je précise que je n'utilise que très rarement JS donc je le maitrise très mal.

Auriez-vous une solution ?
Merci d'avance

2 réponses

  1. TheJoke.r
     
    La requête qui va exécuter le script principal, devrait à la place exécuter un script qui lui fournit une réponse immediatement mais lance le script gourmand en ressource en background.
    Ainsi les navigateurs peuvent relancer une requête puisqu'ils ont obtenu une réponse
    0
    1. Elfeez Messages postés 36 Statut Membre 8
       
      Alors là je ne comprends plus rien... J'ai inversé les fonctions comme ça :

      function launchScript () {
      $.ajax({
      url: "ajout.php",
      type: "POST"
      }).done(function (data) {
      alert(data);
      });
      }

      //Au clic :
      $('#lien_demarrer').click(function checkAvancement (time = true) {
      if (time) {
      //Le lien est caché
      $('#p_demarrer').hide();
      //Lancement de de la fonction script principal
      setTimeout(launchScript(), 100);
      }
      //Lancement du script de vérification
      $.ajax({
      url: "avancement.php",
      type: "POST"
      }).done(function (data) {
      alert(data);
      //Si l'avancement n'est pas à 100%, cette fonction est relancée
      if (data != 100) {
      setTimeout(checkAvancement(false), 1);
      }
      });
      if (time) {
      return false;
      }
      });


      Le code démarre, il entre dans la boucle
      if (time {
      , lance le setTimeout.... et là il attend que la fonction
      launchScript ()
      termine son exéction avant de continuer dans la fonction
      checkAvancement ()
      .
      Donc globalement le pourcentage d'avancement ne s'affiche qu'une fois, lorsque le script principal sur
      ajout.php
      est terminé...
      0
  2. Elfeez Messages postés 36 Statut Membre 8
     
    Problème résolu !

    En faisant des recherches sur mon problème, je suis tombé sur ce sujet : https://www.developpez.net/forums/d995393/javascript/bibliotheques-frameworks/jquery/ajax-jquery-faire-requetes-simultannees/

    Le problème venait du fait que j'avais fait un session_start() sur les 2 pages chargées par les requêtes Ajax, ce qui faisait tout planter.

    Maintenant que j'ai retiré le session_start() d'une des deux pages ça fonctionne parfaitement !
    0