2013-07-19 4 views
0

J'ai essayé de retourner la valeur de la variable 'city' mais je continue à produire des résultats bizarres, je sais qu'il doit y avoir quelque chose qui ne va pas avec mon code, j'espère que tu peux m'aider. .Récupère la valeur de la fonction Jquery

function getCity(lat,lng) 
{ 
var url="http://maps.googleapis.com/maps/api/geocode/json?latlng="; 
var sensor="&sensor=false"; 

var city; 
$.getJSON(url+lat+","+lng+sensor,function(json) 
    { 
     var address=json.results[0].address_components; 
     var addr; 
     for(var i in address) 
      { 
       addr=address[i]; 
       if(addr.types[0] == "locality" && addr.types[1] == "political") 
       { 
        city=addr.long_name; 

       } 
      } 
     }); 
     return city; 
} 
+0

Il y a une erreur avant votre première 'ville de retour '. Je pense qu'il devrait lire 'city = addr.long_name' - il vous manque le' = '. –

+1

Veuillez publier la chaîne JSON envoyée par le serveur et un exemple de vos résultats «bizarres». –

+0

Je pense que vous devriez retourner immédiatement la valeur lorsque votre condition est remplie. Vous n'avez pas besoin d'attendre pour terminer la boucle. –

Répondre

3

$ .getJson est une fonction asynchrone, ce qui signifie que vous retournez la ville, puis le fonction de succès est exécuté (si t il a appelé travaillé). Ce que vous voulez, c'est attendre que l'appel revienne. Voilà ce que je pense est une bonne façon de le faire, en utilisant jquery différé:

function getCity(lat,lng) 
{ 
    var def = jQuery.Deferred(); 
var url="http://maps.googleapis.com/maps/api/geocode/json?latlng=" 
var sensor="&sensor=false"; 

var city; 
$.getJSON(url+lat+","+lng+sensor,function(json) 
    { 
     var address=json.results[0].address_components; 
     var addr; 
     for(var i in address) 
      { 
       addr=address[i]; 
       if(addr.types[0] == "locality" && addr.types[1] == "political") 
       { 
        city=addr.long_name; 

       } 
      } 
     def.resolve(city); 

     }); 
return def.promise(); 
} 

$.when(getCity(40.714623,-74.006605)).then(function (city) { 
alert(city); 
}); 

Fiddle

+0

Deferred/Promise est cuit dans la fonction ajax de jQuery. Vous n'avez pas besoin de créer et de résoudre votre propre objet différé. – Pratheep

+0

@ Phil-R: Travailler bien sur 'mon Fiddle'but Firebug retourne cette erreur: ' TypeError: jQuery.Deferred est pas un constructeur var def = new jQuery.Deferred(); ' Toute suggestion? –

+1

try 'var def = jQuery.Deferred();' sans 'new' – Pratheep

0

Ne pas retourner city dans votre rappel. Affectez-le comme ceci: city = addr.long_name;

Comme il est toujours dans la portée de getCity, il devrait revenir à droite.

Mise à jour

Modifier la façon dont vous demandez les données. Faites comme ceci:

$.getJSON(url+lat+","+lng+sensor).done(function(json){ 

      //Do your assignment here 
}); 

C'est parce qu'il est un appel asynchrone de sorte que vous voulez attribuer une fois qu'il est fait.

+0

J'ai essayé mais je reçois cette erreur, 'TypeError: $ .getJSON (...). Done n'est pas une fonction' Veuillez essayer de corriger. –

1

getcity utilise appel asynchrone (getJSON), qui aura fait plus tard ... vous devriez donc passer rappel qui effectuera l'opération

Une autre option est d'utiliser l'appel synchrone

$.ajax({ 
    url: myUrl, 
    dataType: 'json', 
    async: false, 
    data: myData, 
    success: function(data) { 
    //stuff 
    } 
}); 

mais toujours i sentez, vous ne devriez pas attendre le résultat, parce que le navigateur sera pendu jusqu'au résultat ... alors allez avec l'approche de rappel ...

1

getJSON est un appel asynchrone. Vous ne pouvez donc pas renvoyer une valeur de votre getCity comme une fonction habituelle. Dans votre cas, city sera retourné AVANT que getJSON ne renvoie une valeur quelconque. Vous devez travailler à l'intérieur de la fonction de rappel pour utiliser la valeur de retour. Mais vous pouvez tirer parti de la fonction différée/promesse de jQuery, vous n'avez donc pas besoin d'aller au fond des fonctions de rappel. Vous pouvez essayer le code ci-dessous;

function getCity(lat,lng) { 
    var url="http://maps.googleapis.com/maps/api/geocode/json?latlng="; 
    var sensor="&sensor=false"; 

    return $.getJSON(url+lat+","+lng+sensor); 
} 

function onSuccess(json) { 
    var address=json.results[0].address_components; 
    var addr; 
    var city; 

    for(var i in address) { 
     addr=address[i]; 
     if(addr.types[0] == "locality" && addr.types[1] == "political") { 
      city=addr.long_name; 
     } 
    } 

    // And do other stuff 
} 

function onfail() { 
    // Do something if there is a server error with the getJSON 
} 

getCity(lat, lng).done(onSuccess).fail(onfail); 
Questions connexes