общий javascript

#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());