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

daynasti12 - 16 avril 2013 à 12:10 - Dernière réponse :  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);
Afficher la suite 

3 réponses

Répondre au sujet
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 16 avril 2013 à 15:45
+3
Utile
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).
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_jopop
0
Utile
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.

++
Commenter la réponse de bigbybob
daynasti12 - 18 avril 2013 à 10:53
0
Utile
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.
Commenter la réponse de daynasti12

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.