0

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); 
} 
+0

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

+1

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

+0

@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

Antwort

2

einen Rückruf verwenden eine Aktion oder modifizieren einige Variable nach dem Aufruf an AJAX getPanorama() (und proxy, setStreetView()) vollständig zu tun.

Ändern Sie setStreetView(), um einen Rückrufparameter zu akzeptieren, und übergeben Sie ihn an getPanorama().

streetView { 

    // streetView variables etc. 

    setStreetView: function(coords, element, callback) { 

     // get ready for the AJAX call etc. 

     sv_service.getPanorama({ 
      // parameter object 
     }, function(data, status){ 
      // The getPanorama() callback. 
      // Do stuff with the data/status here, 
      // then call the callback function that you passed in to setStreetView. 
      // You can send data along (e.g. the result of the AJAX call) to the callback. 
      callback(someResult); 
     }); 
    } 
} 

// somewhere else, where you're calling streetView.setStreetView() 
var someVar = "foo"; 
streetView.setStreetView(someCoords, someElement, function(eventualResult){ 
    someVar = eventualResult; 
}); 

Hier ist ein kleines Beispiel: https://jsfiddle.net/_jered/pgftxgf3/

ich sehr empfehlen Sie auch auf AJAX einige der Forschung, asynchrones JavaScript und Rückrufe.

+0

Wow. Vielen Dank! Ich hab es geschafft!. Ich habe eine negative Abstimmung, aber das ist mir egal. Ich schätze, das liegt daran, dass es bereits eine ähnliche Frage gab. Aber ich denke, selbst wenn 2 Leute sehr ähnliche Fragen haben können, ist die Situation vielleicht nicht zu 100% gleich und manchmal braucht man eine spezifischere Antwort oder eine andere oder eine andere Erklärung. Ihre Antwort funktionierte gut und ließ mich erkennen, dass selbst wenn ich dachte, ich wüsste, wie Callbacks funktionieren, dass ich nicht in Wirklichkeit weiß, wie sie funktionieren. Vielen Dank ;-) – Lorthas