2010-06-03 2 views
2

Это простой вопрос, но я не могу это решить.Область переменной в javascript

Спецификации не важны, но вот суть. У меня есть некоторый код, как это:

var lat = 0; 
var lon = 0; 

if (navigator.geolocation) {  
    navigator.geolocation.getCurrentPosition(function(position) { 
     lat = position.coords.latitude; 
     lon = position.coords.longitude; 
    }); 
} 

То, что я думаю, что он делает это:

  1. Установите широты и долгота до 0
  2. Если браузер имеет геолокации, перезаписывать эти переменные с реальными значениями

Однако, в конце этого фрагмента, lat и lon все еще 0. Я попытался добавить var s, передав lat и lon функции и т. Д., Но без успеха ...

Как это сделать?

+0

А, ответы имеют большой смысл. Я знал, что это асинхронно, но я не привык к программированию в этом стиле. Как я могу конкретно выполнить эту работу?После этого куска я использую ajax для доступа к API и не хочу повторять код дважды в зависимости от того, знаем мы местоположение или нет. –

+0

перевести вызов на ваш другой API * внутри * обратный вызов из 'getCurrentPosition' – Pointy

ответ

6

Это асинхронный обратный вызов. В принципе, вы передаете функцию API-интерфейсу навигатора. Затем ваш код продолжает (и делает все). Позже API-интерфейс навигатора вызывает ваш обратный вызов с ответом (положением). Таким образом, все, что использует позицию, должно быть внутри (в том числе вызвано) обратным вызовом.

См. Также this previous answer, в котором показано, как вы можете создавать и использовать функцию обертки.

EDIT: Вы можете просто написать функцию, которая вызывает ваш обратный вызов независимо. Если вы хотите, getLocation может передать еще один флаг в свой аргумент (например, код отказа/успеха).

function getLocation(callback) 
{ 
    if (navigator.geolocation) {  
     navigator.geolocation.getCurrentPosition(callback); 
    } 
    else { 
     callback(null); 
    } 
} 

Тогда позже:

getLocation(function(pos) 
{ 
    //do stuff 
    if(pos != null) 
    { 
    // loc stuff 
    } 
    // more stuff 
}); 

Вы не должны использовать анонимные функции.

2

Это не имеет никакого отношения к сфере применения. getCurrentPosition называется асинхронно, это означает, что он будет возвращен сразу же после получения позиции. function(position) вызывается только при фактическом получении геопозиции.

1

getCurrentPosition() асинхронный - значения не обновляются мгновенно.

Метод getCurrentPosition() принимает один, два или три аргумента. При вызове он должен немедленно вернуться, а затем асинхронно попытаться получить текущее местоположение устройства. Если попытка выполнена успешно, необходимо вызвать команду successCallback (т. Е. Операция handleEvent должна быть вызвана в объекте обратного вызова) с новым объектом Position, отражающим текущее местоположение устройства. Если попытка завершается неудачно, то errorCallback должен быть вызван новым объектом PositionError, отражающим причину сбоя.

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

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