Javascript 为什么地理定位的回调函数(带有';wait';)从未被调用?
这里是新的JS程序员,仍然试图理解Javascript 为什么地理定位的回调函数(带有';wait';)从未被调用?,javascript,async-await,navigator,Javascript,Async Await,Navigator,这里是新的JS程序员,仍然试图理解async和wait。下面的简单示例旨在检索用户的位置,然后更新全局变量。我意识到我必须点击“允许位置访问”弹出窗口,但为什么程序不暂停直到发生这种情况 相反,回调被永远跳过(显然)。也就是说,setUserLocation中从来没有任何输出字符串,并且userLocation的最终打印值与原始值相同。控制台中没有显示未捕获的错误(我在原始代码中进行了错误检查) 编辑:我向getCurrentPosition添加了一个错误处理程序回调。基本上,当提示允许访问位置
async
和wait
。下面的简单示例旨在检索用户的位置,然后更新全局变量。我意识到我必须点击“允许位置访问”弹出窗口,但为什么程序不暂停直到发生这种情况
相反,回调被永远跳过(显然)。也就是说,setUserLocation中从来没有任何输出字符串,并且userLocation
的最终打印值与原始值相同。控制台中没有显示未捕获的错误(我在原始代码中进行了错误检查)
编辑:我向
getCurrentPosition
添加了一个错误处理程序回调。基本上,当提示允许访问位置时,如果我单击“阻止访问”,就会调用它。否则,程序的行为与以前一样
var userLocation = {lat: "40.0", lon: "-90.0", name: "Default Location"}
function setUserLocation(position) { // callback function
console.log("In setUserLocation") // never executed -- why?
lat = position.coords.latitude.toString();
lon = position.coords.longitude.toString();
userLocation.lat = lat ;
userLocation.lon = lon ;
userLocation.name = "New Location" ;
console.log(userLocation) ;
}
function failedLocation() {
console.log("Something went wrong")
}
async function retrieveLocation() {
console.log(userLocation) ;
console.log("Getting location") ;
await navigator.geolocation.getCurrentPosition(setUserLocation,failedLocation);
console.log("Got location") ;
console.log(userLocation) ;
}
retrieveLocation() ;
以下是控制台输出:
getCurrentPosition
不返回任何内容,您必须先“提示”它:
let getLocation=()=>新承诺((解析、拒绝)=>
navigator.geolocation.getCurrentPosition(解析,拒绝));
异步函数main(){
试一试{
log('获取位置…');
let location=等待getLocation();
log('got location');
console.log(位置)
}捕获(e){
console.log('ERROR');
console.log(e.message)
}
}
main()
let getLocation=()=>新承诺((解析、拒绝)=>
navigator.geolocation.getCurrentPosition(解析,拒绝));
异步函数main(){
试一试{
log('获取位置…');
let location=等待getLocation();
log('got location');
console.log(位置)
}捕获(e){
console.log('ERROR');
console.log(e.message)
}
}
main()。剩下的谜团是为什么手动重新检查不起作用——它一直恢复到未检查状态。这在这里被描述为一个bug:
更新Chrome解决了这个问题,现在执行回调。但是,我仍然有一个问题,就是它没有按照所需的顺序执行,所以我不想编辑这个问题(这可能与其他来到这里的人有关),我想我应该发布一个新的问题,其中包含更新的(不同的)问题。我的回调函数从未被执行的原因显然与我的Mac在Big Sur下的安全首选项中未选中Chrome的位置访问有关。剩下的谜团是为什么手动重新检查不起作用——它一直恢复到未检查状态。这在这里被描述为一个bug:
更新Chrome解决了这个问题,现在执行回调。但是,我仍然存在一个问题,即它没有按照所需的顺序执行,因此我不想编辑这个问题(可能与其他来到这里的人相关),而是想发布一个新的问题,其中包含更新的(不同的)问题。相关:getCurrentPosition
立即返回,并通过调用回调“返回”其结果。至于为什么不调用回调,我建议添加一个错误回调来检查。为什么要使其异步?将异步从回调中去掉。然后它工作吗?等待navigator.geolocation.getCurrentPosition(setUserLocation)
-这并不等待setUserLocation
函数-而是等待不返回承诺的getCurrentPosition
方法,因此await
在这种情况下是无用的。使setUserLocation
函数aasync
也没有必要,因为您没有在函数中使用wait
关键字。@不,不起作用。相关:getCurrentPosition
立即返回,并通过调用回调“返回”其结果。至于为什么不调用回调,我建议添加一个错误回调来检查。为什么要使其异步?将异步从回调中去掉。然后它工作吗?等待navigator.geolocation.getCurrentPosition(setUserLocation)
-这并不等待setUserLocation
函数-而是等待不返回承诺的getCurrentPosition
方法,因此await
在这种情况下是无用的。将setUserLocation
函数设为async
也是不必要的,因为您没有在函数中使用wait
关键字。@不,不起作用。这对我也不起作用。如果我阻止对位置弹出窗口的访问,我会得到错误,但如果我允许,我不会得到控制台输出。@GrantPetty:共享您的操作系统/浏览器版本。这总是一个好主意。我想知道这是否仅仅是浏览器的问题。Chrome 89.0.4389.114、MacOS 11.2.3是否在系统首选项>安全和隐私>位置服务中启用了Chrome?这对我也不适用。如果我阻止对位置弹出窗口的访问,我会得到错误,但如果我允许,我不会得到控制台输出。@GrantPetty:共享您的操作系统/浏览器版本。这总是一个好主意。我想知道这是否仅仅是浏览器的问题。Chrome 89.0.4389.114、MacOS 11.2.3是否在系统首选项>安全和隐私>位置服务中启用了Chrome?