информация о местоположении Firefox + область видимости JavaScript - PullRequest
1 голос
/ 26 мая 2011

Я в основном пишу на PHP, я не обладаю обширными знаниями в области JavaScript; надеясь, что кто-нибудь может решить мою проблему довольно быстро. Как указано в комментарии, проверяя mapCenter.Latitude и mapCenter.Longitude - они отображаются пустыми.

, если будет выполняться, если в браузере доступна информация о местоположении - я уверен, что это работает для меня, я проверил это с предупреждением () Кроме того, я знаю, что он правильно захватывает position.coords.latitude / longitude, так как я проверял это и с помощью alert () ... Но значения не являются постоянными вне функции. Это, вероятно, тривиально - что за исправление?

function load(){
        map = new VEMap('MapDiv');  
        map.LoadMap();
        mapCenter = new VELatLong();
        if(navigator.geolocation)
        {
            navigator.geolocation.getCurrentPosition(function(position) 
            {
                mapCenter.Latitude = position.coords.latitude;
                mapCenter.Longitude = position.coords.longitude;

            });             
        }           

        //Inspecting mapCenter.Latitude & mapCenter.Longitude shows empty...

        map.SetCenterAndZoom(mapCenter, 15);
...
...
}

Спасибо!

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

getCurrentPosition принимает обратный вызов, который сообщает мне, что он выполняет асинхронную операцию. Таким образом, происходит то, что код внутри вашей анонимной функции, скорее всего, выполняется после вызова map.setCenterAndZoom(mapCenter, 15). Когда вы работаете с асинхронными операциями, выполнение продолжается после асинхронного вызова без ожидания завершения (следовательно, асинхронного). Поэтому, если вы зависите от каких-либо данных, поступающих от асинхронного вызова, вам необходимо убедиться, что вы обрабатываете их в обратном вызове, поскольку в противном случае они, скорее всего, не будут вам доступны.

Что вам нужно сделать, это сделать звонок внутри ваш обратный вызов следующим образом:

function load(){
        map = new VEMap('MapDiv');  
        map.LoadMap();
        mapCenter = new VELatLong();
        if(navigator.geolocation)
        {
            navigator.geolocation.getCurrentPosition(function(position) 
            {
                mapCenter.Latitude = position.coords.latitude;
                mapCenter.Longitude = position.coords.longitude;
                map.SetCenterAndZoom(mapCenter, 15);
                //any other code that needs to deal with mapCenter
            });             
        }           
}

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

0 голосов
/ 26 мая 2011

geolocation.getCurrentPosition () равно асинхронно .Это означает, что getCurrentPosition () возвращается до вызова функции, которую вы передаете ей.Браузер сохраняет вашу функцию, вычисляет координаты и, наконец, вызывает вашу функцию.Это происходит задолго до завершения функции load (), поэтому mapCenter пуст.

Простое решение - переместить весь последующий код, зависящий от mapCenter, в функцию обратного вызова:

    ...
    navigator.geolocation.getCurrentPosition(function(position) 
    {
        mapCenter.Latitude = position.coords.latitude;
        mapCenter.Longitude = position.coords.longitude;
        ...
        map.SetCenterAndZoom(mapCenter, 15);
        ...
    });
}            
...