2015-10-24 31 views
2

我试图让这些变量:顺便说一下,从navigator.geolocation.getCurrentPosition如何从getCurrentPosition获取位置?

Geoposition.coords.latitude 
Geoposition.coords.longitude 

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

您无法从异步方法返回。 http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call – epascarello

+0

所以你需要把你的代码分解成像这个链接问题所解释的步骤。 – epascarello

回答

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(); 

但只要你想访问你必须等待承诺的坐标数据被fullfilled:

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

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

+0

承诺...漂亮的东西取代1回调,尤其是使用lib。尽管现在学习非常有用。 – Rudie

+1

那么如果你使用es6,babel,jquery或angular,你已经有了承诺(你可以在codepen demo中看到) – jantimon