7

navigator.geolocation のコードを Web ワーカーに移動しようとしています。

Chrome と Safari で試してみましたが、「未定義」になっています

var isGPSSupported = navigator.geolocation;

欲求不満...彼らは仕様で「ナビゲーター」オブジェクトをWebワーカーでサポートする必要があると述べました...

私のコードは以下の通りです:

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

以前にあなたと同様の質問があり、関連する質問をしました。これで、あなたの質問 (および関連する質問の 1 つ) に対する答えが得られたと思います。

navigator.geolocation は、メイン スレッドでのみ navigator に属しますが、ワーカー スレッドでは navigator に属しません。

主な理由は、ワーカー スレッドのナビゲーターはメイン スレッドのナビゲーターとまったく同じように見えますが、これら 2 つのナビゲーターは C++ 側で独立した実装を持っているためです。これが、navigator.geolocation がワーカー スレッドでサポートされていない理由です。

関連するコードは、Chromium コードのNavigator.idlWorkerNavigator.idlにあります。.idl ファイルでは、これらが 2 つの独立したインターフェイスであることがわかります。また、バインディングの C++ 側に独立した実装があります。Navigator は DOMWindow の属性ですが、 WorkerNavigator はWorkerGlobalScopeの属性です。

ただし、JavaScript 側では、navigator という同じ名前になっています。2 つのナビゲーターは 2 つの異なるスコープにあるため、名前の競合はありません。しかし、JavaScript で API を使用する場合、メイン スレッドとワーカー スレッドの名前が同じであれば、通常は同じような動作を期待します。このように曖昧さが生じます。

于 2014-03-11T03:38:55.280 に答える
5

「navigator」オブジェクトサポートされていますが、appName、appVersion、userAgent、および platform の 4 つのプロパティしか含まれていません。

コードを見ると、ユーザーの場所が変更されたときに追跡しようとしているように見えます。これを行うために Web ワーカーを使用する必要はありません。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

クロムで調べると、間違いなく地理位置情報属性がないようです:

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 に答える