#javascript
#javascript
Вопрос:
я давно не писал на js и, по-видимому, немного подзабыл. пытаюсь понять следующую проблему. предупреждение в getCurrentPosition successCallback
показывает широту правильно, но последняя строка предупреждает undefined
. почему моя функция client_location не возвращает широту при вызове вне функции?
client_location = function() {
if (navigator.geolocation) {
return navigator.geolocation.getCurrentPosition(function(position) {
alert(position.coords.latitude); ## RETURNS LATITUDE CORRECTLY ##
return position.coords.latitude;
});
}
};
alert(client_location()); ## RETURNS UNDEFINED ##
Ответ №1:
Вы передаете обратный вызов в getCurrentPosition
и ваш alert
находится внутри этого обратного вызова. Ваш return position.coords.latitude
также находится внутри этого обратного вызова. Ваша client_location
функция возвращает все, что getCurrentPosition
возвращает, и getCurrentPosition
не возвращает ничего.
Если вы хотите что-то сделать с latitude, вам придется сделать это внутри вашего обратного вызова; вы могли бы передать client_location
обратный вызов следующим образом:
client_location = function(callback) {
if (navigator.geolocation) {
return navigator.geolocation.getCurrentPosition(function(position) {
callback(position.coords.latitude);
});
}
};
client_location(function(lat) {
alert(lat);
});
Комментарии:
1. 1 за ссылку на
interface GeoLocation
. Точно показывает, почему конечное предупрежденное значение являетсяundefined
, а не чем-то произвольным.2. @Ray: Я предпочитаю предоставлять авторитетную ссылку, а не ожидать, что люди будут доверять мне как авторитету.
3. хм. я пытаюсь написать простую функцию, которую я могу вызвать, которая возвращает широту, но я хочу избежать необходимости передавать какие-либо аргументы этой функции. как я мог бы усвоить передачу обратного вызова в функцию client_location?
4. @brewster: Это не будет работать очень хорошо, поскольку
getCurrentPosition
является асинхронным; таким образом, вы не знаете, когда получите свой результат отgetCurrentPosition
. Я предлагаю вам привыкнуть к подходу асинхронного обратного вызова, вам приходится постоянно иметь с этим дело при использовании AJAX и множества других API.
Ответ №2:
Если устройство не возвращает геолокацию, оно не определено. Добавьте оператор else, чтобы справиться с отсутствием геолокации.
client_location = function() {
if (navigator.geolocation) {
return navigator.geolocation.getCurrentPosition(function(position) {
alert("clientLocation: " position.coords.latitude);
return position.coords.latitude;
});
}else{
return("no navigator.geolocation");
}
};
alert(client_location());