2010-10-11 5 views
2

J'ai enveloppé un appel ajax commun dans une fonction. Il pings un script, retourne JSON.javascript/jquery portée m'a trébuché

Cependant pour la vie de moi je ne peux pas sembler pouvoir avoir l'objet JSON être la valeur de retour de la fonction.

Doit être quelque chose de simple, je suis manquant, bu pour la vie de moi ne peut pas le résoudre.

function queryCostCenter(user_id, currency_id, country_id){ 

    var output = null; 
    var destinations = new Array(); 

    var destination = { qty:1, country: country_id }; 
    destinations.push(destination)   


    var data = { 
       destinations : $.toJSON(destinations), 
       user_id : user_id, 
       currency_id: currency_id 
       }; 

    $.ajax({ 
     data: data, 
     type: 'POST', 
     url: '/lib/ajax/ajax_prepaid_cost_calculator.php', 
     success: function(data) {   
      output = data; 
      alert(output); 
     } 
    }); 

    alert(output); 

    return json; 

} 

L'alerte() à l'intérieur de l'appel ajax() affiche l'objet json, si essayer d'alerte en dehors de la fonction, et/ou retourner la réponse à l'intérieur de l'appel de sa valeur ajax() est nul ?!

Toute aide/pointeur serait appréciée.

+0

sortie! = Json? – bzlm

+0

doublon de [Renvoie la valeur de la fonction avec un appel Ajax] (http: // stackoverflow.com/questions/562412/return-value-from-function-with-a-ajax-call), [Fonction dans jquery renvoie undefined] (http://stackoverflow.com/questions/2504950/function-inside-jquery-returns -undefined), [la fonction Javascript AJAX renvoie undefined au lieu de true/false] (http://stackoverflow.com/questions/2813974/javascript-ajax-function-returns-undefined-instead-of-true-false), .. – outis

+0

[Renvoi des données de la requête jQuery ajax] (http://stackoverflow.com/questions/2168911/returning-data-from-jquery-ajax-request), [Comment puis-je récupérer les données de la requête jquery ajax?] (http://stackoverflow.com/questions/2902043/how-can-i-get-returning-data-from-jquery-ajax-request), [jquery ajax callback hors de la portée de la fonction] (http: // stackoverflow. com/questions/2691972/jquery-ajax-callback-out-of-the-scope-scope), [retour de jquery ajax call] (http://stackoverflow.com/questions/2844832/return-from-jquery-ajax -call) ... – outis

Répondre

2

$ .ajax() est asynchrone. En bref: l'alerte (sortie) en dehors de votre bloc de fonction sera probablement appelée avant que la méthode async ne renvoie un résultat, par conséquent, elle est toujours nulle.

+0

+1 premier w/bonne réponse – danlefree

+0

@danlefree Vous pouvez corriger toutes les réponses correctes si vous le souhaitez, pas seulement le premier. :) – bzlm

9

Erreur typique. Le code après l'appel Ajax

alert(output); 
return json; 

est exécuté, avant l'appel retourne Ajax. C'est asynchrone (ce qui signifie, il n'est pas exécuté quand et où vous l'avez mis dans le code, mais à un moment ultérieur). Vous pouvez fournir un rappel à votre fonction, comme ceci:

// cb is our callback - it is a function 
function queryCostCenter(user_id, currency_id, country_id, cb){ 
    var destinations = new Array(); 

    var destination = { qty:1, country: country_id }; 
    destinations.push(destination)   

    var data = { 
       destinations : $.toJSON(destinations), 
       user_id : user_id, 
       currency_id: currency_id 
       }; 

    $.ajax({ 
     data: data, 
     type: 'POST', 
     url: '/lib/ajax/ajax_prepaid_cost_calculator.php', 
     success: function(result) { // or just `success: cb` 
      cb(result); // execute the callback with the returned data 
     } 
    }); 
} 

alors:

queryCostCenter(some_value, some_value, some_value, function(result) { 
    // do something with the returned data. 
}); 

Ou mettre toute la logique dans le gestionnaire de succès de l'appel Ajax. Mais avec une fonction de rappel, vous êtes plus flexible et vous pouvez mieux réutiliser la fonction.


Ceci est un cas d'utilisation très courant pour les rappels. Comme vous ne connaissez pas lorsque l'appel Ajax sera terminé, vous passez une fonction à l'appel Ajax qui devrait être exécuté, lorsque certains résultats sont retournés. Vous ne faites rien d'autre avec le gestionnaire success: C'est une fonction qui est appelée lorsque l'appel est terminé.

+0

+1 plus complet + bonne réponse – danlefree

+0

Vous devriez mentionner l'option 'async'. – sje397

+0

Je vais le mentionner. Si vous définissez l'option 'async' sur false, le script s'arrêtera jusqu'à ce que la requête soit terminée. Ajoutez 'async: false,' ci-dessus où vous avez 'data: data' et votre code fonctionne tel quel. Voici quelques lectures. http://api.jquery.com/jQuery.ajax/ – chriscauley

0

vous ne récupérez pas et ne convertissez pas réellement en JSON, juste un gros blob de texte. Regardez la documentation de getJSON, qui est ce que vous devez utiliser.

http://api.jquery.com/jQuery.getJSON/

$.getJSON({ 
    '/lib/ajax/ajax_prepaid_cost_calculator.php', 
    {data:data} 
    , function(data) { 
     alert(data.jsonElement); 
     //do something with your data HERE 

    } 

});

avec jsonElement étant un élément dans votre tableau JSON

1

Ce n'est pas une question de portée. C'est la nature asynchrone de votre appel Ajax. Votre fonction queryCostCenter retournera probablement avant que le gestionnaire Ajax success s'exécute. Vous devez lancer toute la logique post-Ajax dans votre rappel success.