2010-08-24 5 views
3

Ok j'ai donc cette fonction:Jquery données post retour

function getAreas(){ 
     $.post("/custom_html/weathermap.php",'', 
      function(data){ 

       return data 

      }, "json"); 


} 

qui fonctionne très bien. maintenant ce que je suis en train de faire est de transmettre les données à une variable, autrement dit:

var data=getAreas() 

mais il ne marche pas retourner quoi que ce soit. est-il un moyen de faire fonctionner cela?

Merci d'avance pour toute aide.

Répondre

13

C'est un appel asynchrone, donc vous ne pouvez pas y retourner comme ça.

Vous devrez déplacer le code qui fait quelque chose avec data dans la fonction de rappel (function(data){}).

function getAreas(){ 
     $.post("/custom_html/weathermap.php",'', 
      function(data){ 

       //do something with data here, such as calling another function 

      }, "json"); 
} 

Il faut un certain temps pour obtenir votre tête dans la façon asynchrone de penser, mais vous travaillerez dehors. Fondamentalement, le bit de code qui envoie la requête est fait une fois la demande envoyée. Ce fil d'exécution va finir, et votre navigateur va rester là, ne rien faire. l'appel $.post récupérera les données de weathermap.php et votre fonction de rappel sera appelée. Cela commence un tout nouveau fil d'exécution. Essayez de les considérer comme deux exécutions complètement séparées, un appel pré-ajax et un appel post-ajax.

Voici quelques bonté ascii:

 V 
     | 
User clicks button 
(or something else happens) 
     | 
     | 
Your JavaScript runs 
     | 
     | 
And eventually gets 
to the ajax call  -------> SERVER ------>  Server sends data back 
                  | 
                  | 
               And your callback is run 
               on the data and execution 
               continues from here 
                  | 
                  | 
                  V 
-3

Essayez cette

function getAreas(){ 
    var ret; 
    $.post("/custom_html/weathermap.php",'', function(data){ 

      ret = data; 

     }, "json"); 

    return ret; 
} 
+2

Nope, ne fonctionnera pas - 'ret' sera indéfini. – Skilldrick

+0

La portée de la fonction anonyme n'est-elle pas de la même portée que getAreas? [modifier] apparemment je me trompais, désolé :) –

+0

La fonction anonyme est un rappel, et ne sera appelée qu'après le retour de 'getAreas'. – Skilldrick

2

La fonction est appelée de manière asynchrone - cela signifie que le rappel partie est exécutée à un moment donné à l'avenir alors que vos principaux getAreas La fonction() retourne immédiatement. Dans ce cas, il ne renvoie rien car vous n'avez pas d'instruction return dans votre fonction principale. Pour que cela fonctionne, vous devez séparer votre code dans ce qui doit arriver avant d'appeler getAreas() et ce qui se passe ensuite.

Ensuite, vous pourriez vous retrouver avec quelque chose comme:

function getAreas(){ $.post("/custom_html/weathermap.php",'', onGetAreasComplete, "json"); 
} 

function onGetAreasComplete(data) 
{ 
    // do whatever you need to do with data 
} 


// do whatever you need to do before getAreas() 

getAreas(); 

espoir qui fait sens.

6

Vous pouvez archiver que par la mise en async false

jQuery.loadView = function(url,data){ 
    var idata; 
    $.ajax({ 
     type: 'POST', 
     url: url, 
     data: data, 
     dataType: 'html', 
     async: false, 
     success: function(result){idata = result;} 
    }); 
    return idata; 
}