我的问题是关于Javascript。 我有一个回调函数,它在成功的回调上接收一个Position对象。
问题在于,当我尝试在成功的回调中将Position对象的属性设置为全局变量时,它只是不允许我这样做而且全局只是未定义。
作为一种解决方法,而不是直接将对象属性设置为全局变量我试图通过回调函数返回它,但我找不到一种方法将回调函数的返回值设置为全局变量
这是简化的代码。
var x;
navigator.geolocation.getCurrentPosition(onSuccess, onError);
//on Successful callback receives a Position Object
function onSuccess(position) {
var coords = position.coords;
x=coords; // Setting directly to an object does not work x still remains undefined after succesful callback
return coord; // Trying to set this to a global object
}
// onError Callback receives a PositionError object
//
function onError(error) {
alert('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
答案 0 :(得分:15)
您无法从回调中返回值(在本例中)。这意味着在getCurrentPosition
内部,必须在某处分配回调的返回值。
将其分配给全局变量有效,但在您访问该变量时,尚未为其分配新值。 E.g。
// x is assigned in `onSuccess`
var x;
navigator.geolocation.getCurrentPosition(onSuccess, onError);
alert(x); // will be undefined, the response is not processed yet
考虑一下:getCurrentPosition
可能正在执行Ajax请求以获取该位置。这样的请求需要(a)时间(几毫秒),因此(b)是异步,这意味着JavaScript 在收到响应之前不会等待。您的代码方式更快。当你提醒onSuccess
时,x
尚未被召唤。
仅解决方案:
所有必须访问该位置的代码,以便从回调中进入或调用。
答案 1 :(得分:1)
正如Felix King所描述的那样,你无法从回调和全局变量变量中返回一个值,直到AJAX请求完成并且调用回调之后才会设置变量(因此它的名字!)。
使用全局变量可以解决问题,如果你有某种处理循环,你可以将这个代码添加到该循环中,以便在coord更改时执行所需的操作。
if (coord) // global variable has a new value
// process it
alert('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
// then clear it
coord = null;
}
答案 2 :(得分:0)
您是否尝试通过全局window
对象进行设置?
//on Successful callback receives a Position Object
function onSuccess(position) {
var coords = position.coords;
window.x=coords; // Setting directly to an object does not work x still remains undefined after succesful callback
return coord; // Trying to set this to a global object
}
另外,既然你从成功处理程序返回坐标,是不是有另一种方法来获取这个值?
答案 3 :(得分:0)
在console.log(x);
之后加x=cords
检查值(使用FireBug在Chrome和FF上运行)
在OnSuccess调用之后也这样做。
另外不要忘记JS中有异步代码(如果你使用AJAX来获取位置),也许你只是在检查x
答案 4 :(得分:0)
您可以实现一个辅助方法,如flow:
var LocationHelper = function() {};
LocationHelper.prototype.getLocation = function(callback) {
navigator.geolocation.getCurrentPosition(onSuccess, onError);
function onSuccess(pos) {
callback({
pos: pos
});
}
function onError(message) {
callback({
message: message
});
}
};