有没有办法暂停获取直到获得地理位置?

Posted

技术标签:

【中文标题】有没有办法暂停获取直到获得地理位置?【英文标题】:Is there a way to pause fetch until geolocation is obtained? 【发布时间】:2019-04-26 07:54:33 【问题描述】:

我正在使用 National Weather Service Alert API,它可以根据位置提供天气警报。很整洁的东西。我想缩小信息范围,只根据用户的地理位置进行拉取,这是一个可行的选择,并通过输入 html 地址并以 lat long 结束手动测试。我试图通过获取它们的位置并将其添加到返回并在 fetch 行中使用的字符串来自动化 html 构建过程。当我运行它时,控制台显示地址缺少经纬度。

除此之外我没有尝试太多,因为我真的不知道另一种方法可以做到这一点。

函数 loadAlerts()

  fetch(alertDataForUserLocation)
    .then(response => response.json())
    .then(data => 
      console.log(data) // Prints result from `response.json()` in getRequest
    )
    .catch(error => console.error(error))


  function alertDataForUserLocation() 
    var lat = "";
    var long = "";
    if (navigator.geolocation) 
      navigator.geolocation.getCurrentPosition(showPosition);
     else 
      alert("Geolocation needs to be enabled for this site.");
    
    return "https://api.weather.gov/alerts/active?point=?" + lat + "," + long;
  

  function showPosition(position) 
    lat = position.coords.latitude;
    long = position.coords.longitude;
  

我的逻辑告诉我 fetch 将调用函数 alertDataForUserLocation() ,该函数将提供一个正确的 html 地址,最后有一个 lat long。这不是显示的内容。以下是我得到的错误。

api.weather.gov/alerts/active?point=?,:1 加载资源失败:服务器响应状态为 400 ()

【问题讨论】:

【参考方案1】:

首先在showPosition 中更新lat, long 是无法更新alertDataForUserLocation 中的lat, long 这不是JS 中作用域的工作方式。 您将不得不稍微重构您的代码。为了确保alertDataForUserLocation 返回正确的URL,将return 语句移动到showPosition 中。你可以这样做:

function alertDataForUserLocation() 
var lat = "";
var long = "";
if (navigator.geolocation) 
  navigator.geolocation.getCurrentPosition(function showPosition(position)
  lat = position.coords.latitude;
  long = position.coords.longitude;
  let url = "https://api.weather.gov/alerts/active?point=?" + lat + "," + long;  
  return url;
  ,(error)=>console.log(error));
 else 

  alert("Geolocation needs to be enabled for this site.");

还要检查 api 端点是否正确。

【讨论】:

谢谢。这太棒了!

以上是关于有没有办法暂停获取直到获得地理位置?的主要内容,如果未能解决你的问题,请参考以下文章

防止欺骗位置

我在哪里可以获得地理位置数据?

获取精灵一部分的位置

如何使用地理编码宝石获得时区?

即使在暂停时也能获取 iOS 应用的位置更新

地理位置 API 权限 Web 浏览器