Web Workers中的HTML5 navigator.geolocation

问题描述:

我正在尝试将我的代码移到web worker中的navigator.geolocation中。Web Workers中的HTML5 navigator.geolocation

我用Chrome和Safari浏览器,但是,得到 '未定义' 试了一下

VAR isGPSSupported = navigator.geolocation;

失意......他们中的规范, '导航' 的对象应该在网络工作者的支持表示...

我的代码如下:

index.js

var gpsWorker = new Worker("app/gpsworker.js"); 

gpsWorker.onmessage = function (e) { 
    alert(e.data); 
}; 

gpsWorker.postMessage("Start GPS!"); 

gpsWorker.onerror = function (e) { 
    alert("Error in file: " + e.filename + "\nline: " + e.lineno + "\nDescription: " + e.message); 
}; 

gpsworker .js

self.onmessage = function (e) { 
    initGeoLoc(); 
} 

function initGeoLoc() { 
    if (navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(function (position) { 
      self.postMessage("Got position!"); 
     }); 
    } else { 
     self.postMessage("GPS is not supported on this platform."); 
    } 
} 

任何暗示什么是错误将不胜感激。

铬检查它,它看起来绝对不具有地理位置属性:

WorkerNavigator 
appName: "Netscape" 
appVersion: "5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1" 
onLine: true 
platform: "Win32" 
userAgent: "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1" 
__proto__: WorkerNavigator 

在Chrome中,你可以设置你的工人一个断点。我建议为你的错误做这个,它非常有帮助。

“导航器”对象支持,但它只包含四个属性:appName,appVersion,userAgent和platform。

从查看您的代码看来,您正试图跟踪用户位置发生变化。您不必使用网络工作者来完成此任务。你可以简单地使用watchPosition在主线程监视用户的位置(),它会自动通知回调函数,每当用户的位置的变化:

navigator.geolocation.watchPosition(function(position) { 
    document.getElementById('currentLat').innerHTML = position.coords.latitude; 
    document.getElementById('currentLon').innerHTML = position.coords.longitude; 
}); 
+3

但是,如果我们最小化浏览器或屏幕熄灭 – narush 2017-04-01 14:13:30

我以前也有类似的问题,因为你,问a related question。现在我相信我已经回答了你的问题(也是我的一个相关问题)。

navigator.geolocation仅在主线程中属于导航器,但不属于工作线程中的导航器。

主要原因是即使工作线程中的导航器看起来与主线程中的导航器完全相同,但这两个导航器在C++端有独立的实现。这就是为什么navigator.geolocation在工作线程中不受支持的原因。

相关代码位于Chromium代码中的Navigator.idlWorkerNavigator.idl之间。您可以看到它们是.idl文件中的两个独立接口。而且它们在绑定的C++端有独立的实现。导航器属于DOMWindow,而WorkerNavigator属性为WorkerGlobalScope

但是,在JavaScript方面,它们具有相同的名称:navigator。由于两名导航员在两个不同的范围内,因此没有名称冲突。但是,当在JavaScript中使用API​​时,如果主线程和辅助线程具有相同的名称,那么人们通常会期望类似的行为。这就是模糊性发生的原因。

在主线程postMessage()中将watchPosition(成功)放到webWorker的新位置是不够的吗?

+0

这不起作用虽然这个链接可能回答这个问题,但最好在这里包含答案的基本部分并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/12297275) – 2016-05-10 04:22:57

+0

Ashish,答案在上面的第一行。链接提供了未来解决方案的背景。欢呼理查德 – 2016-05-10 06:23:21