Plusieurs requêtes ajax en même temps

Fermé
Elfeez Messages postés 31 Date d'inscription dimanche 7 octobre 2012 Statut Membre Dernière intervention 12 avril 2015 - 20 févr. 2015 à 17:26
Elfeez Messages postés 31 Date d'inscription dimanche 7 octobre 2012 Statut Membre Dernière intervention 12 avril 2015 - 21 févr. 2015 à 15:16
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

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
Elfeez Messages postés 31 Date d'inscription dimanche 7 octobre 2012 Statut Membre Dernière intervention 12 avril 2015 8
21 févr. 2015 à 10:20
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
Elfeez Messages postés 31 Date d'inscription dimanche 7 octobre 2012 Statut Membre Dernière intervention 12 avril 2015 8
21 févr. 2015 à 15:16
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