У меня возникают проблемы с этим фрагментом кода, так как я не уверен, как его исправить. Я уже спрашивал об этом в чатах, но не смог понять себя после некоторых ответов. Я хочу получить Panorama из StreetViewService, используя метод API javascript Google Maps из метода getViewa() StreetViewService. Метод получает литерал с координатами и радиусом и функцию обратного вызова, которая получает 2 параметра: данные и статус. в этом обратном вызове вы проверяете, обслуживает ли он некоторые изображения для просмотра улиц или нет, и в этом случае вы делаете то или другое.Изменение внешней переменной с помощью метода StreetViewService.getPanorama ({}, callback) на Картах Google
Кажется, обратный вызов выполняется асинхронно или метод getPanorama, выполняющий какой-то ajax за кулисами.
Я вставляю код ниже, но сначала объясню свои намерения. Мне нужно вернуться из одного метода, который я сделал внутри литерала, который находится внутри собственной библиотеки, чтобы запрос имел правильные изображения для этих запрошенных координат или нет, установив переменную в true или false, а затем в конце возвращающее это значение. Однако, даже если я устанавливаю переменную в true внутри этой анонимной функции обратного вызова, когда переменная возвращается, она всегда имеет начальное значение, не изменяя ее.
Здесь код. Не все, просто важный код. Тогда мое намерение - использовать логическое значение, возвращаемое, чтобы узнать, нужно ли мне переключаться на одну кнопку для какой-либо работы или нет или делать что-то или нет, в зависимости от того, вернулась ли она true или false, также измените стиль и т. Д. Буду признателен, если бы вы могли изменить свой код так, как это можно было бы сделать. Мне сказали о решении обратного вызова или обернули его в обещание. Однако я не знаю, как это сделать. Я использовал promisses в jquery, но не в ванильном javascript. Я хотел бы посмотреть, как можно было бы сделать решение обратного вызова с помощью этого кода.
//Library not show for shortenning the example.
streetView: { //This is inside a library
valid_request: false,
event_key: null,
panorama: null,
setStreetView: function(coords, element) {
libMapa.streetView.valid_request = false; // Initialize the value again.
let sv_service = new google.maps.StreetViewService();
var latlng = coords;
sv_service.getPanorama({ // This is a method from Google Map Javascript API.
location: latlng,
radius: 50
}, function(data, status) {
if (status === google.maps.StreetViewStatus.OK) {
if (!libMapa.streetView.panorama) {
libMapa.streetView.panorama = new google.maps.StreetViewPanorama(element);
libMapa.streetView.panorama.setEnableCloseButton(true);
}
libMapa.streetView.panorama.setPano(null);
libMapa.streetView.panorama.setPano(data.location.pano);
libMapa.streetView.panorama.setVisible(true);
libMapa.streetView.valid_request = true;
} else {
alert("No images for this place");
// Otherwise variable stays as FALSE.
}
});
return libMapa.streetView.valid_request;
}
}
/****************************************/
//OUTSIDE THE LIBRARY IN INDEX.HTML
var sv_valid = libMapa.streetView.setStreetView(coords, div_mapa);
//sv_valid still shows false even if it should return true.
if (sv_valid) {
// "pressed" is to control a button as if it was a switch by activatinc and deactivating it.
pressed = false; // It always ends up being false even when it should return true.
element.style.cursor = "default";
libMapa.mapa.unByKey(libMapa.streetView.event_key);
}
Я немного не уверен в вашей проблеме. Вы должны более четко объяснить поведение, которое вы ожидаете, что происходит * на самом деле, какие-либо ошибки, которые вы видите, и какие решения вы уже пытались применить к этой проблеме. Тем не менее, похоже, что у вас возникают проблемы с пониманием AJAX и управлением асинхронными событиями. Прямо сейчас я вижу, что вы возвращаете 'libMapa.streetView.valid_request'' таким образом, чтобы он всегда был« ложным ». Обратный вызов для 'getPanorama' не будет запускаться до некоторого времени в будущем * после * вы возвращаете функцию' setStreetView'. – jered
Простейшим решением, вероятно, является использование любого кода, который вы хотите выполнить, как только вы узнаете, что действительный эффект панорамы или нет внутри функции обратного вызова. Не возвращайтесь из функции setStreetView, потому что поток AJAX не работает таким образом. Вместо этого просто установите значение 'streetView.valid_request' соответствующим образом и запустите любой код, необходимый для установки состояния кнопки одновременно (в обратном вызове). – jered
@JCD Однако я должен получить доступ к переменной, которая не находится в библиотеке, и я не могу ее передать и изменить, если только я не мог бы выполнить какую-либо передачу по ссылке с объектом, а затем извлечь новое значение из этого объекта.Я имею в виду, могу ли я перенести переменную в литерал-объект, изменить значение и получить значение? Будет ли это изменено? – Lorthas