我试图获取这些变量:
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"成功"?
答案 0 :(得分:1)
这是一个非常常见的问题 - 每天都会被问到几次 没有简单的方法可以将异步操作转换为同步操作。
但是您可以使用ES6功能:Promises - 如果您无法使用ES6,则可以使用bluebird或lie
等库添加承诺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