这可能是一个新手问题,但我正在尝试创建一个返回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
?
答案 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) {
// ...
}
});