我正在尝试创建一个Web应用程序,该应用程序将提示用户允许使用其位置。我正在使用以下功能。
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
function(position){
return("@" + position.coords.latitude + "," + position.coords.longitude);
}
);
} else {
return("Unknown");
}
}
我的问题是,在提示用户允许进行位置跟踪之前,该函数返回“ undefined”。有谁知道我可以如何修改此代码以等到用户选择之后?另外,我似乎看不到是什么引发了未定义的错误。
对于这种问题,承诺是一个简单的答案。navigator.geolocation.getCurrentPosition
是一个异步调用-这意味着您将调用该方法并将其传递给回调函数,无论何时检索到位置,都将使用结果值(位置)来调用您的回调函数。根据您要调用的异步函数,调用回调函数可能需要1毫秒或1个小时,您所知道的是只要该值可用,它就会“通知”您。
就getLocation
函数而言,要么根本不返回任何内容,要么返回string Unknown
。请注意,从回调返回结果function(position){
与on无关getLocation
。一个非常简单的解决方案(不使用Promises)是简单地给您的getLocation
函数一个回调,所以它看起来像这样:
function getLocation(callback) {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
function(position){
callback("@" + position.coords.latitude + "," + position.coords.longitude)
}
);
} else {
return "Unknown";
}
}
getLocation(function(res) { /* do something with the result */ });
如前所述,解决此问题的另一种方法是使用Promises
。要么使用本机ES6 Promise,要么使用像Bluebird这样的广泛使用的库(我的最爱)。有了promise,代码将看起来像这样:(我建议您阅读一下它,因为Javascript完全是关于异步方法的,因此您应该对这类问题有很好的了解)
function getLocation(callback) {
var promise = new Promise(function(resolve, reject) {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
function(position){
resolve("@" + position.coords.latitude + "," + position.coords.longitude)
}
);
} else {
reject("Unknown");
}
});
return promise;
}
var locationPromise = getLocation();
locationPromise
.then(function(loc) { console.log(loc); })
.catch(function(err) { console.log("No location"); });
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句