Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript将回调函数的返回值赋给全局变量_Javascript_Callback - Fatal编程技术网

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

Javascript将回调函数的返回值赋给全局变量,javascript,callback,Javascript,Callback,我的问题是关于Javascript的。 我有一个回调函数,它在成功回调时接收位置对象 问题是,当我尝试在成功回调时将Position对象的属性设置为全局变量时,它不允许我这样做,全局变量仍然没有定义 作为一种解决方法,我尝试通过回调函数返回它,而不是直接将对象属性设置为全局变量,但是我找不到将回调函数的返回值设置为全局变量的方法 这是简化的代码 var x; navigator.geolocation.getCurrentPosition(onSuccess, onError); //on

我的问题是关于Javascript的。 我有一个回调函数,它在成功回调时接收位置对象

问题是,当我尝试在成功回调时将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');
}

您不能从回调返回值(在本例中)。这意味着在
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
将执行此操作。但事实并非如此,因此您必须提供回调。也许你会发现理解这个问题很有帮助(但我的写作能力不太好;)