【问题标题】:Javascript assigning the return value of a Callback function to global variableJavascript将回调函数的返回值分配给全局变量
【发布时间】:2011-08-25 11:21:24
【问题描述】:

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

【问题讨论】:

    标签: javascript callback


    【解决方案1】:

    您不能从回调中返回值(在这种情况下)。这意味着在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 时,尚未调用onSuccess

    唯一的解决方案:

    所有必须访问位置的代码都在回调中或从回调中调用。

    【讨论】:

    • 其实很好,我的回答是我的愚蠢疏忽。代码不是线性的,所以你需要对回调中的坐标做任何你想做的事情,以确保值已经被绑定
    • 您实际上是对的。getCurrentPosition 函数正在尝试获取异步的地理位置,这就是为什么当我尝试从全局变量访问它时它可能没有设置并返回未定义。没有分配的方法异步函数完成工作后返回值的变量?
    • @Torukojin:不,应该将值返回到哪里?如前所述,代码是异步运行的。这就是为什么将值作为参数传递给回调函数的原因,以便您可以使用它并使用它做任何您想做的事情。如果可以return 值,那么getCurrentPosition 会这样做。但事实并非如此,因此您提供了回调。也许你会发现this article 有助于理解问题(但我的写作能力不是很好;))
    【解决方案2】:

    正如 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;
      } 
    

    【讨论】:

      【解决方案3】:

      您是否尝试过通过全局 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 
      
      }
      

      另外,由于您从成功处理程序返回坐标,是否没有其他方法可以获取此值?

      【讨论】:

        【解决方案4】:

        x=cords 之后添加console.log(x); 以检查值(适用于Chrome 和带有FireBug 的FF)

        在调用 OnSuccess 之后也这样做。

        另外别忘了JS中有异步代码(如果你使用AJAX获取位置的话),也许你只是在查看x的值时没有收到答案

        【讨论】:

          【解决方案5】:

          你可以实现一个像flowing这样的辅助方法:

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

          【讨论】:

            猜你喜欢
            • 2017-01-16
            • 1970-01-01
            • 1970-01-01
            • 2021-10-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多