0
votes

l'alerte est ouverte avant la fin de la fonction getPosition

Le getPosition () est une fonction qui nous permet de trouver notre position, le problème est que l'alerte est arrivée avant la fin de la fonction, au premier moment l'alerte est nulle et alors je peux obtenir les valeurs

 <input type="button" value="test" onClick="test()">
 <script>
 var coordinates = {latitude: null, longitude: null, error: false}
    
      function test(){
           getPosition();
           alert(coordinates.latitude);
      }

      function getPosition() {
           navigator.geolocation.getCurrentPosition(success, fail);
           function success (pos) {
                coordinates.latitude = pos.coords.latitude;
                coordinates.longitude = pos.coords.longitude;
           }
           function fail(error){
                coordinates.error = true;
           }
      }
 </script>


0 commentaires

3 Réponses :


0
votes

Vous devrez faire en sorte que l ' alerte attende la réponse de navigator.geolocation.getCurrentPosition .

Pour ce faire, vous pouvez soit utiliser async / await comme suit:

 <input type="button" value="test" onClick="test()">
 <script>
 var coordinates = {latitude: null, longitude: null, error: false}
    
      function test(){
           getPosition();
      }

      function getPosition() {
           navigator.geolocation.getCurrentPosition(success, fail);
           function success (pos) {
                coordinates.latitude = pos.coords.latitude;
                coordinates.longitude = pos.coords.longitude;
                alert(coordinates.latitude);
           }
           function fail(error){
                coordinates.error = true;
                alert("Error getting coordinates");
           }
      }
 </script>

ou continuez à utiliser les rappels comme suit:

<input type="button" value="test" onClick="test()">
<script>
 var coordinates = {latitude: null, longitude: null, error: false}
    
      async function test(){
           try {
            const result = await getPosition();
            alert(coordinates.latitude);
           } catch(error) {
                alert("Error getting coordinates");
           }
           
      }

      async function getPosition() {
      return new Promise((resolve, reject) => {
                 navigator.geolocation.getCurrentPosition(success, fail);
           function success (pos) {
                coordinates.latitude = pos.coords.latitude;
                coordinates.longitude = pos.coords.longitude;
                resolve();
           }
           function fail(error){
                coordinates.error = true;
                reject(error);
           }
      });

      }
 </script>


0 commentaires

0
votes

Avez-vous besoin d'une variable coordonnées dans la portée globale? Sinon, un choix est d'éviter d'initialiser la variable coordonnées en dehors de la fonction getPosition . De cette façon, l'alerte devra se produire une fois que l'utilisateur aura donné l'autorisation d'obtenir sa position. Par exemple, vous pouvez faire ce qui suit:

<input type="button" value="test" onClick="getPosition()">
<script>
      function getPosition() {
          navigator.geolocation.getCurrentPosition(success, fail);
          
          function success (pos) {
            alert(pos.coords.longitude)
          }
          function fail(error){
            coordinates.error = true;
          }
      }
</script>

Vous pouvez simplifier encore plus cette approche en ne définissant pas du tout de variable de coordonnées.

<input type="button" value="test" onClick="getPosition()">
<script>
      function getPosition() {
          var coordinates = {}
          navigator.geolocation.getCurrentPosition(success, fail);
          
          function success (pos) {
            coordinates.latitude = pos.coords.latitude;
            coordinates.longitude = pos.coords.longitude;
            alert(coordinates.latitude)
          }
          function fail(error){
              coordinates.error = true;
          }
      }
</script>

p >


0 commentaires

0
votes

Ceci est dû au fait que JavaScript est un langage asynchrone ( alert () se déclenche avant la fonction success () ), donc je recommanderais d'utiliser Promises strong> et async / await comme ceci:

<input type="button" value="test" onClick="test()">
<script>
    var coordinates = {
        latitude: null,
        longitude: null,
        error: false
    }

    async function test() {
        try {
            //await will make code wait until resolve() is called
            await getPosition();
            //If this runs resolve() has ben called
        } catch(e) {
            //This means reject() has ben called
            //Therefore coordinates.error in no longeer needed
        }
        alert(coordinates.latitude);
    }

    function getPosition() {
        return new Promise((resolve, reject) => {
            navigator.geolocation.getCurrentPosition(success, reject);

            //Since you dont use any data in fail() i've replaced it with reject
            function success(pos) {
                coordinates.latitude = pos.coords.latitude;
                coordinates.longitude = pos.coords.longitude;
                resolve();
            }
        });
    }
</script>


0 commentaires