Web Worker для определения местоположения GPS не возвращает вейлы из рабочего скрипта - PullRequest
0 голосов
/ 12 февраля 2019

Я работаю над проектом веб-работника.Веб-работник - это небольшой файл javascript, который определяет GPS-координаты пользователей и каждые 5 секунд отправляет данные обратно в сценарий главной страницы, используя postMessage.

Я протестировал только рабочий javascript, и он, кажется, работает нормально, я могу получать координаты GPS каждые 5 минут и отображать их в окне предупреждения (для тестирования), и я протестировал код главной страницы с помощьюдругой рабочий сценарий, и он тоже, кажется, работает нормально, но когда я проверяю код главной страницы с помощью рабочего сценария, чтобы получить координаты GPS, из рабочего сценария ничего не получается.

Может кто-нибудь помочь мне подсчитатьпочему это не работает и предлагает решение?

Моя цель - иметь рабочий скрипт gps, который работает непрерывно в фоновом режиме и обновляет позицию gps пользователя каждые 5 минут, а затем передает эту информацию обратно в основнойскрипт страницы, где он будет отображаться и храниться в базе данных 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 голосов
/ 12 февраля 2019

Ваша проблема в том, что объект 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>

Вы не можете использовать API геолокации из Worker.
Но так как этот API асинхронный, я неточно знаю, почему вы хотите выполнить его с рабочего.

...