地理位置 API - 等待获取位置

Posted

技术标签:

【中文标题】地理位置 API - 等待获取位置【英文标题】:Geolocation API - wait for getting position 【发布时间】:2016-10-10 14:34:33 【问题描述】:

我只是想知道以下用例的正确 Geolocation API 用法是什么:

我有某种形式的网站(针对手机)。用户输入一些文本并按“提交”。我需要记录用户的位置(GPS 坐标)以及输入的数据,并且(重要!)如果用户没有给予许可或我们无法确定他\她的位置,则会发出一些警告消息。

在我看来,问题在于 Geolocation API 是异步的。因此,在按下“提交”后,执行流程与提交后照常执行的主要流程分离-将数据记录到数据库中,而异步流程-仅在API接收到坐标时才执行回调。

目前我已经实现了一些解决方法 - 将自定义 getLocation JS 函数添加到 onSubmit 执行:

function recordPosition(position) 
    var latitude = position.coords.latitude;
    var longitude = position.coords.longitude;
    //perform POST query to the server to write coordinates to the database
  
  function getLocation() 
    if (navigator.geolocation) 
      navigator.geolocation.getCurrentPosition(recordPosition);

     else 
      alert("Geolocation is not supported by this browser.");
    
  

但是这种方法将数据记录和位置记录分开,我不能禁止没有位置的数据保存..

一旦我是异步新手,我只想拥有同步版本的 GetCurrentPosition 函数,但这似乎是不可能的\意识形态错误的解决方案。但是在这种情况下我该怎么办呢?

【问题讨论】:

【参考方案1】:

在此处查看此示例:https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition

基本上,如果您使用 javascript 执行 POST - 您没有问题。

你可以这样做:

HTML:

JS:

function onSubmit()
    var iLat = document.getElementById('latitude');
    if(!iLat.value)
        getLocation();
        return false;
    


function recordPosition(position) 
    var iLat = document.getElementById('latitude');
    var iLong = document.getElementById('longitude');
    iLat.value = position.coords.latitude;
    iLong.value = position.coords.longitude;

    iLat.form.submit();


function getLocation() 
    if (navigator.geolocation) 
        navigator.geolocation.getCurrentPosition(getLocation_success, getLocation_error);
     else 
        alert("Geolocation is not supported by this browser.");
    


function getLocation_success(pos)
    showPosition(pos);
    recordPosition(pos);


function getLocation_error(err)
    console.warn('ERROR(' + err.code + '): ' + err.message);

【讨论】:

我当然看过 tis 手册。但似乎您没有发现问题(因为您的示例与我在开始时写的基本相同) - 我有数据表格,我想要坐标并将它们与表格中的数据相关联。我不想将它们分开,我需要它们相互连接。 我想你可能完全错过了我的观点。您不应该尝试 POST 两次。查看我更新的答案,它阻止了第一个 POST,然后等待位置并再次 POST。 是的,更新版本更好,几个小时前我实现了相同的方法。这正是我需要的,谢谢。如果您将 JSFiddle 添加到您的答案中作为说明,那就太好了。但实际上我遇到了另一个问题(可能是特定于 CActiveForm 的 Yii?) - 当我这样做时,文本输入的值正在丢失,如果我只是在 onSubmit 函数中提醒它 - 坐标很好,但用户输入变为空: (有什么想法吗?

以上是关于地理位置 API - 等待获取位置的主要内容,如果未能解决你的问题,请参考以下文章

新的位置 API Android。错误“调用 connect() 并等待调用 onConnected()”

在特定时间获得最佳位置

捕获地理位置错误 - 异步等待

对象 A 如何等待对象 B 在其核心位置委托中完成获取位置数据,以便它可以使用数据?

AsyncTask 等待位置

Facebook API 覆盖背景位置属性中的图像偏移