如何从getCurrentPosition获得位置?

时间:2015-10-24 23:52:45

标签: javascript

我试图获取这些变量:

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对象中没有克隆,但在这里它们似乎就是这样。 我究竟做错了什么?我怎样才能在回调中使用coords"成功"?

1 个答案:

答案 0 :(得分:1)

这是一个非常常见的问题 - 每天都会被问到几次 没有简单的方法可以将异步操作转换为同步操作。

但是您可以使用ES6功能:Promises - 如果您无法使用ES6,则可以使用bluebirdlie

等库添加承诺
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