Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.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 前往';返回true';基于嵌套函数的条件_Javascript_Return Value_Conditional Statements - Fatal编程技术网

Javascript 前往';返回true';基于嵌套函数的条件

Javascript 前往';返回true';基于嵌套函数的条件,javascript,return-value,conditional-statements,Javascript,Return Value,Conditional Statements,这可能是一个新手问题,但我正在尝试创建一个返回true的函数。但是,这是基于内部其他几个函数中发生的情况 function checkGeo(){ // CHECK FOR GEOLOCATION if( "geolocation" in navigator ) { navigator.geolocation.getCurrentPosition( function(position){ sessionStorage.pinlat =

这可能是一个新手问题,但我正在尝试创建一个返回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。如何检查此异步函数是否已结束,从而检查其结果,以便
返回true

匿名函数中的
位置
与它后面的
if
语句中的
位置
不同。JavaScript中的作用域(为了简单起见,忽略ES6
let
关键字)是按函数定义的

此外,如果
getCurrentPosition()
是异步的,那么您不能依赖匿名回调函数来运行其他函数

如果您只想让
返回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
指示地理位置已成功设置,那么您需要以同步函数返回值以外的其他方式指示它,因为您不知道将设置它(可能会发生错误,用户可能不允许为您的站点设置地理位置等)直到异步函数调用回调为止。

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

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

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) {
    // ...
  }
});

您的函数是否有一个
完成的
变量

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

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

getCurrentPosition
是否偶然发出了一个异步web请求?@WiktorZychla是的,我认为它来自规范:“调用时,它必须立即返回,然后异步尝试获取设备的当前位置。”我还听到(“地理位置”)在navigator中)是设备/连接上资源消耗最少的。我不同意。这并不能确定我是否真的有位置,对吗+1用于范围界定!HeadDesk正确,它不会告诉您是否有位置,只是有一种方法可以尝试检索位置。我确实在代码上面的文本中指出了这一点。谢谢你的帮助。也许问题更具体一些:如何监视
getCurrentPosition()
结束并检查其值,然后在满足条件时返回true。我不太明白这一点,你能解释一下吗?似乎
self
没有
ready
方法。只有
可以。另外,
self.result
是你所说的“完成”变量吗?@benracicotjavascript有点奇怪
self
实际上指的是checkGeo的
this
。因为
.getCurrentPosition
具有不同的作用域,所以我们需要使用
self
,以便访问它
var self=this
实际上并不创建它的副本,更像是一个引用。好的,我想我有这个
run.ready
实际上有
getCurrentPosition
的作用域,这就是我们可以获取的。结果是什么?@BenRacicot是的,这非常重要,伙计,谢谢。很好的代码和解释。我希望我能适应未来的发展。那么,在等待异步函数完成时,创建自己的回调来观察成功吗?我确实得到了一个
回调不是函数
错误吗?@BenRacicot:检查拼写,并且您在调用中发送了一个函数。这实际上是有道理的,没有调用
回调的函数
当然它会报告错误。你能解释一下在没有伪代码的情况下发送函数是如何工作的吗?@BenRacicot:你不必给函数命名
callback
,它是
checkGeo
函数中的参数名。示例中的代码不是伪代码,而是您可以使用的实际代码。如果您希望在调用后发生某些事情,只需要使用一些代码来完成它。