如何从getCurrentPosition中获取位置信息?

3

我试图获取这些变量:

Geoposition.coords.latitude
Geoposition.coords.longitude

顺便提一下,来自 navigator.geolocation.getCurrentPosition

function getPosition() {
    "use strict";
    var coordinates = {
        latitude: null,
        longitude: null,
        error: false,
        testData: 'Hello, world!'
    }
    function success (pos) {
        coordinates.latitude = pos.coords.latitude;
        coordinates.longitude = pos.coords.longitude;
        coordinates.testData = 'I am John';
        console.log(coordinates); //here it is ok, latitude,longitude and testData were recorded
    }

    function fail(error){
        coordinates.error = true;
    }
    navigator.geolocation.getCurrentPosition(success, fail);
    return coordinates; // but here it is no ok: function returns "coordinates" in initial state (null, null, false, "Hello, world!")
}

据我所知,在JavaScript中,对象不会被克隆,但在这里似乎被克隆了。我做错了什么?如何在回调函数“success”之外使用coords?

1
你不能从异步方法中返回。https://dev59.com/RGYq5IYBdhLWcg3wwDRA - epascarello
所以你需要像那个链接的问题所解释的那样,将你的代码分解成步骤。 - epascarello
1个回答

2
这是一个非常普遍的问题 - 它每天都会被问几次。没有简单的方法可以将异步操作转换为同步操作。
但是,您可以使用ES6功能:Promises - 如果无法使用ES6,则可以使用类似bluebirdlie的库添加promises。
function getPosition() {
    "use strict";
    return new Promise(function(resolve, reject) {
      var coordinates = {
          latitude: null,
          longitude: null,
          error: false,
          testData: 'Hello, world!'
      }
      function success (pos) {
          coordinates.latitude = pos.coords.latitude;
          coordinates.longitude = pos.coords.longitude;
          coordinates.testData = 'I am John';
          resolve(coordinates);
      }

      function fail(error){
          coordinates.error = true;
          resolve(coordinates); // or reject(error);
      }
      navigator.geolocation.getCurrentPosition(success, fail);
    });
}

在其他地方,您可以同步使用该函数:

var coordinatePromise = getPosition();

但是,一旦您想要访问坐标数据,就必须等待承诺得到实现:

var coordinatePromise = getPosition();
coordinatePromise.then(function(coordinates) { console.log(coordinates) }); 

查看 CodePen 演示:http://codepen.io/anon/pen/GpxZEg


承诺...对于替代一个回调函数来说,这是相当重要的东西,尤其是使用库时。现在学习它非常有用。 - Rudie
1
如果你使用es6、babel、jquery或angular,你已经拥有了promise(正如你可以在codepen演示中看到的那样)。 - jantimon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接