2010-04-01 7 views
2

J'essaie de renvoyer le tableau de succès ajax d'une fonction à l'autre. Pour une raison quelconque, je ne semble pas être en mesure de transmettre les données stockées dans une variable dans la partie réussite de la fonction ajax dans la fonction parent à retourner.Jquery post-succès variable portée

Je regardé ce poste pour essayer de comprendre les choses, mais pas de chance: jQuery Ajax call - Set variable value on success

Merci beaucoup pour toute aide.

est ici une version simplifiée du code:

// make json_to_return global 
var json_to_return; 

function loop_through_data(){ 

    // call the load_days function and put its array data into days_array 
    var days_data = load_days(03,2010); 

    // I'd like to be able to iterate through days_data here 
    // 
    // 
} 

function load_days(selectedMonth, selectedYear){ 
        $.ajax({ 
        type: "POST", 
        dataType: "json", 
        url: "../includes/get_availability.php", 
        data: "month=" + selectedMonth + "&year=" + selectedYear, 
        success: function(available_json){ 
         json_to_return = available_json; 
        }, 
        error: function(msg){ 
        alert("error " + msg); 
        } 
       }); 
       return json_to_return; 

} 

Répondre

6

Cette partie de votre fonction arrive plus tard:

success: function(available_json){ 
        json_to_return = available_json; 
       } 

donc la variable que vous êtes de retour est indéfinie, car le code pour le régler ne se produit pas jusqu'à ce que la réponse revienne du serveur. Appelez le reste du code à exécuter à partir de votre fonction de réussite, de sorte qu'il s'exécute lorsque les données sont prêtes, ou définissez async:false (moins souhaitable car il verrouille le navigateur).

La méthode async: false est comme ceci:

   $.ajax({ 
       type: "POST", 
       async: false, 
       dataType: "json", 
       url: "../includes/get_availability.php", 
       data: "month=" + selectedMonth + "&year=" + selectedYear, 
       success: function(available_json){ 
        json_to_return = available_json; 
       }, 
       error: function(msg){ 
       alert("error " + msg); 
       } 
      }); 

La meilleure approche:

   $.ajax({ 
       type: "POST", 
       dataType: "json", 
       url: "../includes/get_availability.php", 
       data: "month=" + selectedMonth + "&year=" + selectedYear, 
       success: function(available_json){ 
        loopThroughTheDaysAndDoStuff(available_json); 
       }, 
       error: function(msg){ 
       alert("error " + msg); 
       } 
      }); 
+0

Merci, je n'avais pas réalisé que le retour avait eu lieu avant la fin du poste. Tout s'explique maintenant. Je vais re-jig des choses afin qu'ils se produisent dans le succès: J'espérais l'utiliser comme un utilitaire que je pourrais appeler à partir de plusieurs fonctions, mais cela fonctionnera pour l'instant. – salonMonsters

2

$.ajax est une fonction asynchrone.

Cela signifie que lorsqu'elle est appelée, la fonction continue à s'exécuter.

Dans votre code fourni var days_data = load_days(03,2010); cela se produit:

  • Démarrer un appel ajax (asynchrone, la fonction continue d'exécuter)
  • retour json_to_return (non défini)
  • days_data == undefined
  • termine appel ajax , json_to_return est affectée (cela peut arriver dans n'importe quel timespan)

Vous devez repenser votre logique et commencer à coder autour de l'asynchronisme de l'appel ajax.

Une première approche pourrait être de passer une fonction (callback) à load_days qui devrait être appelée APRÈS le succès de l'appel ajax.

+0

Où est le bouton "Garder mon nouvel avatar d'avril"? –

+0

une autre approche intéressante - merci – salonMonsters