最好的回归真实的方法'基于嵌套函数的条件

时间:2015-04-25 21:33:06

标签: javascript return-value conditional-statements

这可能是一个新手问题,但我正在尝试创建一个返回true 的函数。但是,这是基于内部其他几个函数中发生的事情。

function checkGeo(){

    // CHECK FOR GEOLOCATION
    if( "geolocation" in navigator ) {

        navigator.geolocation.getCurrentPosition( function(position){
            sessionStorage.pinlat = position.coords.latitude; 
            sessionStorage.pinlon = position.coords.longitude; 
            // position object is set!
        });

        // position is not defined
        if ( position.coords.latitude && position.coords.longitude ){ 
           return true; 
        }

    }

}

这是我希望通过地理位置检查发生事情的顺序,但我有点惊讶的是嵌套if在getCurrentPosition方法完成之前进行了测试。

将此条件放在getCurrentPosition成功函数中并从那里返回true不会使checkGeo返回true。如何检查此异步函数是否已结束,因此检查其结果是否为return true

3 个答案:

答案 0 :(得分:1)

匿名函数中的

position与后面的position语句中的if不同。 JavaScript中的范围(为简单起见忽略ES6 let关键字)是按函数。

此外,如果getCurrentPosition()是异步的,那么您就不能依赖匿名回调函数在其他任何事情之前运行。

如果您希望return true表示您想要获得地理定位信息而不保证您将获得成功,请使用更多类似的内容:

function checkGeo(){
    var hasGeolocation = false;

    // CHECK FOR GEOLOCATION
    if( "geolocation" in navigator ) {
        hasGeolocation = true;

        navigator.geolocation.getCurrentPosition( function(position){
            sessionStorage.pinlat = position.coords.latitude; 
            sessionStorage.pinlon = position.coords.longitude; 
            // position object is set! but only inside this function.
        });

        return hasGeolocation;
    }
}

另一方面,如果您尝试让return true表示地理定位已成功设置,那么您需要以同步函数的返回值之外的其他方式指示它,因为您赢了&#39 ; t知道它将被设置(可能会发生错误,用户可能会禁止您的站点的地理位置等),直到异步函数调用回调。

答案 1 :(得分:1)

让您的函数有finished变量

function checkGeo(){
    var self = this;
    this.ready  = function () {}
    this.result = false;
    if("geolocation" in navigator) {
        navigator.geolocation.getCurrentPosition(function(position) {
            sessionStorage.pinlat = position.coords.latitude; 
            sessionStorage.pinlon = position.coords.longitude; 
            self.result = (position.coords.latitude && position.coords.longitude);
            self.ready.call(self);
        });
    }
}

现在你可以使用这个功能:

var run = new checkGeo();
run.ready = function () {
    alert(this.result); //Both work
    alert(run.result);  //Both work
};

有点复杂,但在我看来编程更好。

答案 2 :(得分:0)

地理位置调用是异步的,因此您无法从函数返回结果。当函数结束时,您还不知道异步调用的结果。从异步调用的回调中返回任何内容都不会使该函数返回值,因为该函数已经返回。

您可以使用回调来报告结果。您必须使用检查异步调用的回调中位置的代码:

function checkGeo(callback){
  if( "geolocation" in navigator ) {
    navigator.geolocation.getCurrentPosition(function(position){
      sessionStorage.pinlat = position.coords.latitude; 
      sessionStorage.pinlon = position.coords.longitude; 
      callback(position.coords.latitude && position.coords.longitude);
    });
  } else {
    callback(false);
  }
}

用法:

checkGeo(function(exists){
  // here you can use the result
  if (exists) {
    // ...
  }
});