Javascript将回调函数的返回值赋给全局变量
我的问题是关于Javascript的。 我有一个回调函数,它在成功回调时接收位置对象 问题是,当我尝试在成功回调时将Position对象的属性设置为全局变量时,它不允许我这样做,全局变量仍然没有定义 作为一种解决方法,我尝试通过回调函数返回它,而不是直接将对象属性设置为全局变量,但是我找不到将回调函数的返回值设置为全局变量的方法 这是简化的代码Javascript将回调函数的返回值赋给全局变量,javascript,callback,Javascript,Callback,我的问题是关于Javascript的。 我有一个回调函数,它在成功回调时接收位置对象 问题是,当我尝试在成功回调时将Position对象的属性设置为全局变量时,它不允许我这样做,全局变量仍然没有定义 作为一种解决方法,我尝试通过回调函数返回它,而不是直接将对象属性设置为全局变量,但是我找不到将回调函数的返回值设置为全局变量的方法 这是简化的代码 var x; navigator.geolocation.getCurrentPosition(onSuccess, onError); //on
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');
}
您不能从回调返回值(在本例中)。这意味着在
getCurrentPosition
的内部,回调的返回值必须分配到某个地方
将其分配给全局变量是可行的,但在访问该变量时,尚未为其分配新值。例如
// 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不会等到收到响应。你的代码要快得多<当您向x
发出警报时,尚未调用code>onSuccess
唯一解决方案:
必须访问回调中的位置或从回调调用的位置的所有代码。您是否尝试过通过全局
窗口设置它
//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
}
另外,由于您从成功处理程序返回坐标,是否有其他方法可以获取此值?放置console.log(x)
紧跟在x=cords
之后检查值(适用于带有FireBug的Chrome和FF)
在调用OnSuccess之后也要这样做
另外,不要忘记JS中有异步代码(如果您使用AJAX获得位置),也许您在检查x
的值时没有收到答案,正如Felix King所述,您无法从回调和全局变量变量中返回值,直到AJAX请求完成并调用回调(因此得名!)之后,才会设置该变量
使用一个全局变量可以解决您的问题,如果您有某种处理循环,您可以将此代码添加到该循环中,以便在协调发生变化时执行所需的操作
if (coord) // global variable has a new value
// process it
alert('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
// then clear it
coord = null;
}
您可以实现以下帮助器方法:
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
});
}
};
说得好,我的回答是我的一个愚蠢的疏忽。代码不是线性的,因此您需要对回调中的coords执行任何操作,为了确保值已被绑定,您实际上是对的。getCurrentPosition函数正在尝试获取异步的地理位置,这就是为什么当我尝试从全局变量访问它时,它可能未被设置并返回未定义的值。在异步函数使用完它的job?@Torukojin:不,应该将值返回到哪里?如上所述,代码异步运行。这就是为什么将该值作为参数传递给回调函数,以便您可以使用它并对其执行任何操作。如果可以返回值
,则getCurrentPosition
将执行此操作。但事实并非如此,因此您必须提供回调。也许你会发现理解这个问题很有帮助(但我的写作能力不太好;)