Javascript 前往';返回true';基于嵌套函数的条件
这可能是一个新手问题,但我正在尝试创建一个返回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 =
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中的作用域(为了简单起见,忽略ES6let
关键字)是按函数定义的
此外,如果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
函数中的参数名。示例中的代码不是伪代码,而是您可以使用的实际代码。如果您希望在调用后发生某些事情,只需要使用一些代码来完成它。