GPS位置的Web Worker无法从辅助脚本返回值

时间:2019-02-12 00:23:10

标签: javascript html5 web-worker

我正在从事网络工作者项目。网络工作者是一个小的javascript文件,它确定用户的GPS坐标,并使用postMessage每5秒将数据发送回首页脚本。

我已经单独测试了工作程序Javascript,并且似乎工作正常,我每5分钟可以获取GPS坐标并将其显示在警报框中(以进行测试),并且我已经使用其他工作程序脚本测试了主页代码似乎也可以正常工作,但是当我使用工作脚本测试主页代码以获取GPS坐标时,工作脚本什么也没收到。

任何人都可以帮助我弄清楚为什么它不起作用并提出解决方案吗?

我的目标是要有一个gps worker脚本,该脚本在后台连续运行,并每5分钟更新一次用户的gps位置,然后将该信息传递回主页脚本,该脚本将在其中显示并存储在mysql数据库中。

这是主页脚本

<!DOCTYPE html>
<html>
    <head>
    </head> 
        <body onload="startWorker()"> 
            <p>Your GPS Coordinates are:
                <output id="result"></output>
            </p>
            <script>
                var w;

                function startWorker() {
                    if (typeof(Worker) !== "undefined") {
                    if (typeof(w) == "undefined") {
                        w = new Worker("x05.js");
                    }
                    w.onmessage = function(event) {
                    document.getElementById("result").innerHTML = event.data;
                    };
                    } else {
                        document.getElementById("result").innerHTML = "Sorry! No Web Worker support.";
                    }
                }
            </script>
        </body>
</html>

这是工作文件脚本

function getLocation()
{
    navigator.geolocation.getCurrentPosition(getPosition);
}

function getPosition(position)
{
    var lat = position.coords.latitude;
    var lon = position.coords.longitude;
    var location = 'lat='+position.coords.latitude+'<br>long='+position.coords.longitude;
    postMessage(location);
    setTimeout(getLocation, 5000);

}
getLocation()

1 个答案:

答案 0 :(得分:0)

您的问题是来自Worker范围的self.navigator对象与构成主范围的对象不同。

这里有一个WorkerNavigator对象,与Navigator一个对象不同,该对象没有geolocation属性。

const w = new Worker(getWorkerURL());
w.onmessage = e => console.log(e.data);

function getWorkerURL() {
  return URL.createObjectURL(new Blob([
    document.querySelector('script[type="worker-script"]')
      .textContent
  ]));
}
<script type="worker-script">
  postMessage(navigator.toString()); // "[object WorkerNavigator]"
  postMessage(navigator.geolocation); // undefined
</script>

您不能在Worker内使用Geolocation API。
但是由于该API是异步的,所以我不确定为什么您仍然要从Worker中执行它。