algemene javascript

ik heb niet geschreven in JS in een tijdje en blijkbaar ben ik een beetje roestig. proberen het volgende probleem te begrijpen. de waarschuwing in getCurrentPosition successCallback geeft de breedtegraad correct weer, maar de laatste regel waarschuwt undefined . waarom retourneert mijn client_location-functie niet de breedtegraad wanneer ik buiten de functie bel?

client_location = function() {
  if (navigator.geolocation) {
    return navigator.geolocation.getCurrentPosition(function(position) {
      alert(position.coords.latitude);  ## RETURNS LATITUDE CORRECTLY ##
      return position.coords.latitude;
    });
  }
};
alert(client_location());               ## RETURNS UNDEFINED ##
0
Kolonel sluiting.
toegevoegd de auteur Dave Newton, de bron

2 antwoord

U geeft een callback door aan getCurrentPosition en uw melding bevindt zich in die callback. Uw return position.coords.latitude bevindt zich ook binnen die callback. De functie client_location retourneert de getCurrentPosition returns en getCurrentPosition retourneert niets .

Als je iets met de breedtegraad wilt doen, moet je dit doen binnen je callback; je kunt client_location een callback sturen zoals deze:

client_location = function(callback) {
  if (navigator.geolocation) {
    return navigator.geolocation.getCurrentPosition(function(position) {
      callback(position.coords.latitude);
    });
  }
};

client_location(function(lat) {
    alert(lat);
});
3
toegevoegd
+1 voor de link naar de interface GeoLocation . Toont precies waarom de laatste gewaarschuwde waarde undefined is en niet iets willekeurigs.
toegevoegd de auteur Ray Toal, de bron
hm. Ik probeer een eenvoudige functie te schrijven. Ik kan noemen dat de breedtegraad wordt teruggegeven, maar ik wil voorkomen dat ik argumenten aan die functie moet doorgeven. hoe kan ik het doorgeven van een callback in de client_location-functie internaliseren?
toegevoegd de auteur brewster, de bron
@Ray: Ik geef de voorkeur aan een gezaghebbende referentie in plaats van te verwachten dat mensen mij als een autoriteit vertrouwen.
toegevoegd de auteur mu is too short, de bron
@brewster: Dat gaat niet goed werken, aangezien getCurrentPosition asynchroon is; dus je weet niet wanneer je het resultaat van getCurrentPosition krijgt. Ik stel voor dat je went aan de async callback-aanpak, je moet er de hele tijd mee omgaan als je AJAX en veel andere API's gebruikt.
toegevoegd de auteur mu is too short, de bron

Als het apparaat geen geolocatie retourneert, is dit ongedefinieerd. Voeg een else-statement toe om te gaan met geen geolocatie.

client_location = function() {
  if (navigator.geolocation) {
    return navigator.geolocation.getCurrentPosition(function(position) {
      alert("clientLocation: "+position.coords.latitude);
      return position.coords.latitude;
    });
  }else{
    return("no navigator.geolocation");  
  }
};
alert(client_location()); 
0
toegevoegd