7

我正在尝试在网络工作者中移动我的 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.");
    }
}

任何关于错误的提示将不胜感激。

4

4 回答 4

9

我之前有过和你类似的问题,并问了一个相关的问题。现在我相信我已经回答了你的问题(也是我的一个相关问题)。

navigator.geolocation 只属于主线程中的 navigator,但不属于工作线程中的 navigator。

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

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

但是,在 JavaScript 方面,它们具有相同的名称:navigator。由于两个导航器在两个不同的作用域中,所以不存在名称冲突。但是当在 JavaScript 中使用 API 时,如果主线程和工作线程具有相同的名称,人们通常会期望它们具有相似的行为。歧义就是这样发生的。

于 2014-03-11T03:38:55.280 回答
5

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

通过查看您的代码,您似乎正在尝试跟踪用户位置的变化。您不必使用网络工作者来完成此操作。您可以使用watchPosition()简单地监视用户在主线程上的位置,当用户位置发生变化时,它将自动通知回调函数:

navigator.geolocation.watchPosition(function(position) {
    document.getElementById('currentLat').innerHTML = position.coords.latitude;
    document.getElementById('currentLon').innerHTML = position.coords.longitude;
});
于 2012-10-10T15:04:38.683 回答
1

在 chrome 中检查它,它似乎绝对没有 geolocation 属性:

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 中,您可以在工作人员中设置断点。我建议为您的错误执行此操作,它非常有帮助。

于 2012-07-18T20:08:50.497 回答
-1

让主线程 postMessage() 中的 watchPosition(success) 成为 webWorker 的新位置还不够吗?

于 2016-05-10T01:46:47.023 回答