2015-10-20 10 views
6

Sto provando a creare una funzione che creerà un nuovo marker. Devo essere in grado di elaborare alcune delle proprietà del nuovo marcatore nel callback. Il problema è che viene creato immediatamente e può essere utilizzato per richiamare la richiamata, ma alcune proprietà non sono ancora disponibili.Come posso aspettare che un oggetto creato in modo asincrono sia completamente disponibile prima di richiamare un callback?

Se attendo due secondi prima di provare ad accedere alle proprietà, funziona perfettamente - questo mi porta a credere che l'oggetto sia ancora in grado di generare se stesso dopo essere stato creato in modo asincrono.

<!DOCTYPE html> 
<html> 
    <head> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
    <meta charset="utf-8"> 
    <title>Simple markers</title> 
    <style> 
     html, body { 
     height: 100%; 
     margin: 0; 
     padding: 0; 
     } 
     #map { 
     height: 100%; 
     } 
    </style> 
    </head> 
    <body> 
    <div id="map"></div> 
    <script> 

function initMap() { 
    var latLng = new google.maps.LatLng(-25.363, 131.044); 

    var map = new google.maps.Map(document.getElementById('map'), { 
    zoom: 4, 
    center: latLng 
    }); 

    function placeMarker(map, latLng, callback, callback2){ 
     var marker = new google.maps.Marker({ 
      position: latLng, 
      map: map }); 

     callback(marker); 
     callback2(marker); 
    } 

    placeMarker(map, latLng, function(marker){ 
     setTimeout(function(){ 
      console.log(marker.Xg.Oa) 
     }, 2000); 
    }, function(marker){ 
     console.log(marker.Xg.Oa); 
    }); 

} 
    </script> 
    <script async defer 
     src="https://maps.googleapis.com/maps/api/js?signed_in=true&callback=initMap"></script> 
    </body> 
</html> 

In questo esempio la richiamata:

setTimeout(function(){ 
    console.log(marker.Xg.Oa) 
}, 2000); 

cede la risposta corretta. Ma il callback che non aspetta mostra un errore non definito:

function(marker){ 
    console.log(marker.Xg.Oa); 
} 

sto usando un libreria API di Google Maps Javascript qui, e scherzi con la roba google.maps non è un'opzione per ovvie ragioni. Voglio passare l'intero oggetto al callback, ma devo assicurarmi che le informazioni di latLng (marker.Xg.Oa) esistano prima di invocarlo. Come posso assicurarmi che sia lì prima di richiamare la richiamata?

+1

ho una specie di difficile credere questo _isn't_ un duplicato, ma per la vita di me non riuscivo a trovare uno. – HPierce

+4

Sai qualcosa delle promesse? Aggiungerò una risposta che potrebbe aiutare ... – AdamJeffers

+0

Conosco loro, ma per quanto ne so non fanno parte di vanilla JS (che sarebbe preferibile). Sono aperto a usarli se questo è ciò che è necessario. – HPierce

risposta

7

NB: non ho ancora testato questo, ma qualcosa in questo senso ...

var map = //... 
var latLng = //... 

function placeMarker(map, latLng, callback){ 

    return new Promise(function(resolve, reject)(){ 

     getMarker().then(function(marker){ 
      //The marker is immediately available 
      console.log(marker); //me {__gm: Object, ... } 

      //Try to get the value we need 
      console.log(marker.Xg.Oa); //Uncaught TypeError: Cannot read property 'Oa' of undefined 

      //wait two seconds and try again 
      setTimeout(function(){ console.log(marker.Xg.Oa) }, 2000); // L {} (this is the expected output) 

      while(!marker.Xg.Oa){ //Uncaught TypeError: Cannot read property 'Oa' of undefined 
       callback(marker.Xg.Oa); 
      } 

      resolve(true); 
     }); 
    }); 

} 

function getMarker() 
{ 
    return new Promise(function(resolve, reject){ 
     var marker = new google.maps.Marker({ 
      position: latLng, 
      map: map 
     }); 

     resolve(marker); 
    }); 
} 
+0

Ho modificato la domanda per creare un esempio più verificabile. Ma sospetto che questa sia la direzione che dirò. – HPierce

+1

[Dopo una discussione meta] (http://meta.stackoverflow.com/questions/308444/ive-asked-an-xy-question-what-should-i-do-with-it) - Sto accettando questo rispondi dato che in realtà risponde alla domanda che ho posto - ma dovrebbe essere notato (apprezzerei se hai modificato la risposta) che si basa su cattive pratiche di accesso agli oggetti di google maps in modo scadente. – HPierce

+0

Punto valido ... lascia fare a me! – AdamJeffers

Problemi correlati