Javascript 为什么地理定位的回调函数(带有';wait';)从未被调用?

Javascript 为什么地理定位的回调函数(带有';wait';)从未被调用?,javascript,async-await,navigator,Javascript,Async Await,Navigator,这里是新的JS程序员,仍然试图理解async和wait。下面的简单示例旨在检索用户的位置,然后更新全局变量。我意识到我必须点击“允许位置访问”弹出窗口,但为什么程序不暂停直到发生这种情况 相反,回调被永远跳过(显然)。也就是说,setUserLocation中从来没有任何输出字符串,并且userLocation的最终打印值与原始值相同。控制台中没有显示未捕获的错误(我在原始代码中进行了错误检查) 编辑:我向getCurrentPosition添加了一个错误处理程序回调。基本上,当提示允许访问位置

这里是新的JS程序员,仍然试图理解
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
函数a
async
也没有必要,因为您没有在函数中使用
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?