Ich habe Probleme mit diesem Code, da ich mir nicht sicher bin, wie ich das beheben kann. Ich habe das schon in den Chats gefragt, konnte mich aber nach einigen Antworten nicht selbst herausfinden. Ich möchte Panorama von StreetViewService mit der Methode der Google Maps-JavaScript-API von einer StreetViewService-Methode getPanorama() erhalten. Die Methode empfängt ein Literal mit den Koordinaten und einem Radius und eine Callback-Funktion, die 2 Parameter empfängt: Daten und Status. In diesem Callback überprüfen Sie, ob der Service einige Bilder für die Street View zurückgibt oder nicht, in welchem Fall Sie das eine oder andere tun.Ändern der externen Variable aus der StreetViewService.getPanorama ({}, Callback) -Methode von Google Maps
Es scheint, dass der Callback asynchron ausgeführt wird oder die Methode getPanorama, die eine Art Ajax hinter den Kulissen ausführt.
Ich paste den Code unten, aber zuerst erkläre ich meine Absichten. Ich muss von einer Methode, die ich in einem Literal gemacht habe, das in einer selbst erstellten Bibliothek ist, zurückkehren, ob die Anfrage gültige Bilder für die angeforderten Koordinaten hat oder nicht, indem ich eine Variable auf wahr oder falsch setze und dann am Ende diesen Wert zurückgebe. Aber selbst wenn ich die Variable innerhalb dieser anonymen Callback-Funktion auf "True" setze, hat sie immer dann ihren Anfangswert, wenn sie nicht zurückgegeben wird.
Hier der Code. Nicht alles, nur der wesentliche Code. Dann ist meine Absicht, den boolean zurückzugeben, um zu wissen, ob ich einen Knopf für irgendeine Art von Job aktiv oder nicht aktiv haben muss oder einige Sachen oder nicht abhängig davon tun, wenn es wahr oder falsch zurückgab, ändert etwas Art etc. Ich würde mich freuen, wenn Sie meinen Code so ändern könnten, wie es möglich wäre. Mir wurde gesagt, dass es sich um eine Callback-Lösung handelt oder um eine Zusage. Aber ich weiß nicht, wie es geht. Ich habe Versprechen in jQuery, aber nicht in Vanille Javascript. Ich würde gerne sehen, wie die Callback-Lösung auch mit diesem Code gemacht werden könnte.
//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);
}
Ich bin ein wenig unsicher, was Ihr Problem ist. Sie sollten das Verhalten, das Sie erwarten, genauer erklären, was tatsächlich passiert ist, alle Fehler, die Sie sehen, und welche Lösungen Sie bereits versucht haben, auf das Problem anzuwenden. Trotzdem scheint es, dass Sie Probleme haben, den AJAX zu verstehen und asynchrone Ereignisse zu verwalten. Sofort sehe ich, dass Sie 'libMapa.streetView.valid_request;' auf eine Weise zurückgeben, die immer dazu führt, dass es 'false' ist. Der Callback für 'getPanorama' wird erst nach einiger Zeit * nach * der Rückgabe der 'setStreetView'-Funktion ausgeführt. – jered
Die einfachste Lösung besteht wahrscheinlich darin, den gewünschten Code festzuhalten, sobald Sie wissen, dass das Ergebnis des Panoramas innerhalb der Callback-Funktion gültig ist oder nicht. Kehren Sie nicht von der setStreetView-Funktion zurück, da der AJAX-Fluss nicht so funktioniert. Setzen Sie stattdessen einfach den Wert von 'streetView._request_request' und führen Sie den Code aus, den Sie benötigen, um den Status der Schaltfläche zur gleichen Zeit (im Callback) festzulegen. – jered
@JCD Allerdings muss ich auf eine Variable zugreifen, die nicht in der Bibliothek ist, und ich kann sie nicht übergeben und ändern, es sei denn, ich könnte irgendeine Art von Verweis über ein Objekt durchführen und dann den neuen Wert von diesem Objekt abrufen.Ich meine, könnte ich die Variable in ein literales Objekt einfügen, den Wert ändern und den Wert erhalten? Würde es geändert werden? – Lorthas