переменная javascript в картах Google недоступна, поэтому я в замешательстве!

#javascript #google-maps-api-3

#javascript #google-maps-api-3

Вопрос:

Я работаю с Google Maps v3 и столкнулся с очень сложной ситуацией, используя StreetViewService для проверки наличия streetview на моем маркере. В моей функции ‘loadMap’ я запускаю эту проверку с помощью:

 //more 'loadMap' function code above and below this

var streetViewCheck = new google.maps.StreetViewService();  
streetViewCheck.getPanoramaByLocation(latlng, 50, function(result, status) {
    if (status == google.maps.StreetViewStatus.ZERO_RESULTS) {
        streetViewAvailable = 0;        
    }else{
        streetViewAvailable = 1;
    }
});
alert(streetViewAvailable);
  

Приведенное выше предупреждение выдает сообщение об ошибке js «streetViewAvailable не определен», и переменная недоступна нигде во всей функции. Однако, если я помещу свои предупреждения здесь:

 var streetViewCheck = new google.maps.StreetViewService();  
streetViewCheck.getPanoramaByLocation(latlng, 50, function(result, status) {
    if (status == google.maps.StreetViewStatus.ZERO_RESULTS) {
        streetViewAvailable = 0;
        alert(streetViewAvailable);     
    }else{
        streetViewAvailable = 1;
        alert(streetViewAvailable);
    }
});
  

Они правильно предупреждают (т. Е. 0, если streetview недоступен, 1, если он есть), но снова переменная недоступна нигде в функции. И теперь, что действительно озадачивает, переменная доступна в других функциях.

Что, черт возьми, происходит? Почему моя переменная не определена в функции, которая ее инициализирует, но определена и доступна в других функциях. Я не лучший в мире программист (но и не худший eiter!) но это меня полностью поставило в тупик. Я перепробовал много вариантов, но все с тем же результатом (т. Е. инициализирую переменную ‘streetViewAvailable’ над моим новым google.maps.StreetViewService(); код, присваивающий им значения ‘yes’ и ‘no’ вместо 1 и 0, делающий их локальными переменными вместо глобальных (var streetViewAvailable …), и все комбинации только что упомянутых, но все с одинаковым результатом, не определенные в этой функции.

Пожалуйста, пожалуйста, помогите мне разобраться в этом, это также ставит в тупик других наших программистов, это противоречит всякой логике!!! Заранее большое-большое спасибо, я надеюсь, что кто-нибудь сможет пролить свет на это, прежде чем мой мозг взорвется!!!

Ответ №1:

// больше кода функции 'loadMap' выше и ниже этого 
доступен var streetViewAvailable;

var streetViewCheck = новый google.maps.StreetViewService(); 
streetViewCheck.getPanoramaByLocation(latlng, 50, функция (результат, статус) { 
 если (статус == google.maps.StreetViewStatus.ZERO_RESULTS) { 
 streetViewAvailable = 0; 
 }else{ 
 streetViewAvailable = 1;
 }
});
оповещение (доступно для просмотра улиц);

Попробуйте это — вы действительно забыли объявить streetViewAvailable

Комментарии:

1. Эй, спасибо за совет, но я пробовал это, и это не сработало. Мне удалось оторвать нашего главного программиста от его рабочего стола на несколько минут, и он обнаружил причину, приведенный выше код запускается только после завершения загрузки карты, вот почему он недоступен в функции. Но еще раз спасибо за ваше время и усилия!!!

Ответ №2:

Это поведение по умолчанию для любого вызова AJAX. Ваш streetViewCheck.getPanoramaByLocation() выполняет вызов AJAX для поиска данных. Поскольку вызов асинхронный, остальная часть вашего кода продолжает выполняться, и оповещение выполняется до завершения вызова ajax. Вот почему она пуста.