2013-07-19 2 views
0

Я пытаюсь вернуть значение переменной «city», но я продолжаю отслеживать странные результаты, я знаю, что в моем коде должно быть что-то не так, я надеюсь, вы можете помочь мне разобраться, что это такое ,Получить значение из функции 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

Перед первым «возвращением города» произошла ошибка. Я думаю, что он должен читать 'city = addr.long_name' - вам не хватает' = '. –

+1

Пожалуйста, отправьте строку JSON, отправленную сервером, и пример ваших «странных» результатов. –

+0

Я думаю, что вы должны немедленно вернуть значение, когда ваше условие выполнено. Вам не нужно ждать, чтобы закончить цикл. –

ответ

3

$ .getJson - это асинхронная функция, что означает, что вы возвращаете город, затем выполняется функция успеха (если t он звонил, работал). Вы хотите дождаться, когда звонок вернется. Вот что я думаю, что это хороший способ сделать это, используя JQuery отложенное:

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

Отложенное/обещание выпекается в функции ajax jQuery. Вам не нужно создавать и разрешать свой собственный объект «Отложенные». – Pratheep

+0

@ Фил-R: Работа штрафа на 'Fiddle'but мой поджигатель возвращает эту ошибку: ' TypeError: jQuery.Deferred не является конструктором вар DEF = новый jQuery.Deferred(); ' Любое предложение? –

+1

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

0

Не возвращайте city в своем обратном вызове. Просто назначьте его следующим образом: city = addr.long_name;

Поскольку он все еще находится в области getCity, он должен возвращаться вправо.

Update

изменить способ запроса данных. Делают это так:

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

      //Do your assignment here 
}); 

Это происходит потому, что это асинхронный вызов, так что вы хотите присвоила после это делается.

+0

Я пробовал это, но я получаю эту ошибку, 'TypeError: $ .getJSON (...). Done не является функцией' Попробуйте исправить ошибку. –

1

getcity использует асинхронный вызов (getJSON), который будет иметь результат позже ... так что вы должны передать функцию обратного вызова, которая будет выполнять операцию

Другой вариант заключается в использовании синхронного вызова

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

, но до сих пор я чувствуйте, вы не должны ждать результата, потому что браузер будет повешен до результата ... поэтому перейдите с обратным вызовом ...

1

getJSON асинхронный вызов. Поэтому вы не можете вернуть значение из своего getCity, как обычно. В вашем случае city будет возвращен до того, как getJSON вернет любое значение. Вам нужно работать внутри функции обратного вызова, чтобы использовать возвращаемое значение.

Но вы можете воспользоваться отсрочкой/обещанием jQuery, поэтому вам не нужно углубляться в функции обратного вызова. Вы можете попробовать код ниже;

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); 
Смежные вопросы