J'arrive pas à récupérer la valeur de retour de ajax.onreadystatechange

Résolu
daynasti12 - 16 avril 2013 à 12:10
 daynasti12 - 18 avril 2013 à 10:53
J'ai le problème suivant: L'ordre d'exécution ne se fait pas correctement. Je veux récupérer la valeur de retour d'une fonction (un tableau) dans une autre fonction. à priori c'est très simple, mais ça se complique pour moi à cause de la fameuse ajax.onreadystatechange qui s’exécute d'une manière asynchrone ce qui fait que je peut pas récupérer sa valeur de retour dans le code qui suit:
voila mon code:

var tabImage=new Array;
function remplissageDynamiqueImagesParId(idImag,tabImage)
{

    var ajax = new XMLHttpRequest();   
    ajax.onreadystatechange=function(){
    alert("4");
     if(ajax.readyState==4 && (ajax.status==200||ajax.status==0)){
     eval('var data = ' + ajax.responseText + ';');  
     var theResults = data.results;
    alert("5");
     for(var i=0;i<theResults.length;i++)
     {
         tabImage[i]=new imageFromBase(theResults[i].idImage,theResults[i].url);


     }
     alert("taille tableau "+tabImage.length);
     return tabImage;

 }

}
    ajax.open("GET","http://localhost/jsonrecuperImagesParId.php?id="+idImag,true);
    ajax.send();
    alert("fin remplissageDynamiqueImagesParId");
}//fin methode
function test() 
{
    alert("dans test");
remplissageDynamiqueImagesParId(10,tabImage);
alert("fin test");
alert("taille tableau dans test: "+tabImage.length);    
}

remarque: j'ai fait des alerte pour s'assurer de l'ordre de l’exécution des instructions et voila le résultat:

Dans test
4
Fin remplissageDynamiqueImageParId
Fin test
Taille tableau dans test :0
4
Dans test
4
Fin remplissageDynamiqueImageParId
Fin test
Taille tableau dans test :0
4
4
5
Taille tableau 5
4
5
Taille tableau 5



javascript:void(0);javascript:void(0);
l'ordre d’exécution des instructions est incorrecte et je peux pas récupérer mon tableau.
Donc ma question est la suivante: javascript:void(0);
comment je peux bloquer l’exécution jusqu'à ce que ajax.onreadystatechange termine son son travail?
quelqu'un peut m'aider?? javascript:void(0);javascript:void(0);

3 réponses

cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
16 avril 2013 à 15:45
Salut,

déjà petite remarque : pour tester des requêtes asynchrones et l'ordre d'exécution, l'utilisation d'alert() n'est pas trop recommandée (puisque les alert() bloquent le thread principal).

Ensuite je vois pas de souci dans l'ordre d'exécution que tu nous montres (à part la multiplicité des sorties). Plus la requête est lourde (retour volumineux, serveur lent ...) plus les messages "5" et "Taille tableau 5" arriveront tard. C'est le principe de la requête asynchrone.

Sans comprendre donc vraiment ce qui te pose souci, saches que tu peux également utiliser les XmlHttpRequest en mode synchrone (en mettant le dernier paramètre de la fonction open à false).
3
Salut,

Jopop a raison, tu devrais essayer de faire ta requête Ajax en synchrone plutôt qu'en asynchrone. La ton ordre d'exécution est bon à priori. Ça ne va rien changer au fonctionnement de ton script, t'aura toujours une requête sans rechargement de page, mais t'aura pas de "décalage" dans ton affichage.

Pour ma part, j'utilise des
console.log("ta string");
pour afficher mes logs quand je debug au lieu des alerts (Surtout qu'on n'a qu'un alert à la fois je crois), combiné avec FireBug pour les voir dans mon navigateur.

++
0
c'est bon, ça marche il suffit de changer le dernier paramètre de la fonction open à false et enlever les alertes et ça marche, merci beaucoup pour votre aide.
0
Rejoignez-nous