Javascript将回调函数的返回值分配给全局变量

时间:2011-08-25 11:21:24

标签: javascript callback

我的问题是关于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');
}

5 个答案:

答案 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
        });
    }

  };