2014-01-22 2 views
-1

Я работаю над геокодированием в Google Map, и мне интересно, почему мой скрипт не будет иметь значение g_lat и g_long на этом оповещении? Я уверен, что это имеет значение, поскольку когда я делаю console.log(), он показывает что-то.переменная, не передающая значение вне функции

var g_lat; 
var g_long; 

geocoder.geocode({ 'address': address}, function(results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
    g_lat = results[0].geometry.location.lat(); 
    g_long = results[0].geometry.location.lng(); 
    console.log(g_lat); // output: -33.8468085 
    console.log(g_long); // output: 151.06454640000004 
    } else { 
    alert('Geocode was not successful for the following reason: ' + status); 
    } 
}); 
alert(g_lat); // output: undefined 
alert(g_long); // output: undefined 
+0

потому что функция геокодирования асинхронна .... –

+0

спасибо Аруну, однако я очень наивна в JS, что это значит? –

+0

Ответ в дубликате не совсем понятен. -_- –

ответ

1

Leandro, похоже, вам, возможно, потребуется определить, какие области вашего кода вы можете использовать в отдельных функциях. Это упростит достижение того, что вы хотите сделать.

Во-первых, однако, обратные вызовы. Вы знаете, что вы можете передавать функции как параметры в другие функции? Это чрезвычайно полезная функция, особенно когда вы имеете дело с асинхронными вызовами API. Что-то вроде этого примера - мы вызываем doThis, но передаем функцию для вызова, как только мы выполнили все остальные вещи в doThis, что нам нужно. Консоль покажет журналы в порядке.

// `doThis` receives a function as a callback and executes it after doing stuff. 
function doThis(callback) { 
    console.log('logged first'); 
    callback(); 
} 

// pass in a function as a parameter to `doThis` when we call it 
doThis(function() { 
    console.log('logged second'); 
}); 

Ну, мы можем это сделать и с вашим кодом. (Я сократил часть вашего кода для краткости)

Вставьте код геокода в его собственную функцию. Здесь я толкая результаты Геокодировать в функции обратного вызова:

function getGeocode(callback) { 
    geocoder.geocode({'address': address}, function (results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     callback(results); 
    } 
    }); 
} 

Затем вызовите эту функцию из где-то в вашем коде, используя функцию обратного вызова. Здесь обратный вызов получает данные результатов из функции геокодирования.

getGeocode(function (results) { 
    var g_lat = results[0].geometry.location.lat(); 
    var g_long = results[0].geometry.location.lng(); 
    console.log(g_lat, g_long); 
}); 

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

function getGeocode(address, callback) { 
    geocoder.geocode({'address': address}, function (results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     callback(results); 
    } 
    }); 
} 

function getGeocodeAndProcess(address) { 
    getGeocode(address, function (results) { 
    var g_lat = results[0].geometry.location.lat(); 
    var g_long = results[0].geometry.location.lng(); 
    console.log(g_lat, g_long); 
    }); 
} 

getGeocodeAndProcess('chicago'); 

Надеюсь, это было полезно для вас.

+0

Огромное спасибо за объяснение Энди. Теперь он работает благодаря: –

+0

NP. Удачи. – Andy

1

Именно из-за асинхронной природы запроса

var g_lat; 
var g_long; 

//this sends an asynchronous request, meaning the execution of next statements will continue without waiting for the response to the request 
geocoder.geocode({ 
    'address': address 
}, function (results, status) { 
    //once the request is completed this method gets called, all code that depends on the value returned by this request should be kept here 
    if (status == google.maps.GeocoderStatus.OK) { 
     g_lat = results[0].geometry.location.lat(); 
     g_long = results[0].geometry.location.lng(); 
     console.log(g_lat); // output: -33.8468085 
     console.log(g_long); // output: 151.06454640000004 
    } else { 
     alert('Geocode was not successful for the following reason: ' + status); 
    } 
}); 
//thest statements are executed before the response comes back so you are getting undefined 
alert(g_lat); // output: undefined 
alert(g_long); // output: undefined 
+0

Я не в курсе, что должно быть правильно, что я должен делать? –

+0

@LeandroGarcia оповещения должны быть в методе обратного вызова .... где вы используете значения 'g_lat' и' g_long' –

+0

Нет, это будет работать именно так, но я не могу его использовать. alert() есть только для меня, чтобы знать, содержит ли он что-то, –

-1

я не мог проверить его, но он должен сделать трюк, дайте мне знать.

var g_lat; 
var g_long; 


geocoder.geocode({'address': address}.then 
    (function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      g_lat = results[0].geometry.location.lat(); 
      g_long = results[0].geometry.location.lng(); 
      console.log(g_lat); 
      console.log(g_long); 
     } 
    }),function(error) { 
     alert('Geocode was not successful for the following reason: ' + error); 
    } 
}); 
+0

, чтобы затем() sesems был новым во мне, что он делает? –

+0

Этот код не работает. 1), потому что 'then' не работает так, и 2), если вы хотите использовать' then', вам нужно будет использовать отложенный объект, который этот код не делает. – Andy

+0

Затем работает как обратный вызов, делает геокод, а затем, когда получает от него вызов, выполняет эту функцию. Я не вижу проблемы. Например: myWebService.get («http://www.example.com») .затем (функция (результат) { возврата myDb.add (результат); }) .then (функция() { console.log ('Данные успешно сохранены'); }, функция (ошибка) { консоли. log ('произошла ошибка при сохранении:'); console.dir (ошибка); }); Шрифт [ссылка] http://msdn.microsoft.com/en-us/library/windows/apps/hh700330.aspx – Icaro

Смежные вопросы