#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. Вот почему она пуста.