HTML веб-работник не работает должным образом - PullRequest
0 голосов
/ 29 мая 2018

У меня есть ниже код в main.html

if(typeof(Worker) !== "undefined") {
        if(typeof(w) == "undefined") {
            w = new Worker("/location_worker.js");
        }
        w.onmessage = function(event) {
        sequence = event.data;
        if(Cookies.get("location_tracked") == "done")
        {
            w.terminate();
            w = undefined;
            return;
        }
        if(navigator.geolocation)
        {
            navigator.geolocation.getCurrentPosition(function(position)
            {
                lat = position.coords.latitude;
                lon = position.coords.longitude;
                $.ajax({
                  type: "POST",
                  url: "/api/",
                  data: {'action':'receive_loc', 'lat': lat,'lon': lon,'enc_data': enc_data,'reached': reached , 'sequence' : sequence },
                  success: function(jres)
                  {
                    res = JSON.parse(jres);

                    stop = false;

                    if(res.status == 11)
                    {
                        stop = true;
                    }


                    if(!stop)
                    {
                        //loop continues
                    }else{
                        finished = true;
                        w.terminate();
                        w = undefined;
                        return;
                    }
                  },
                });
            },function(code, message) {
                $('#error').html("<b>Location Sharing blocked by User..</b>");
            });


        } else{
            alert("Sorry, your browser does not support HTML5 geolocation.");
        }

        };
    } else {
        document.getElementById("result").innerHTML = "Sorry, your browser does not support Web Workers...";
    }

И location_worker.js содержит ниже

var i = 0;
var ft = 2000;
function timedCount() {
    i = i + 1;
    self.postMessage(i);
    console.log(i);
    setTimeout("timedCount()",ft);
}
timedCount();

, поэтому длякаждые 2 секунды будет передаваться ajax, который работает нормально, но в следующих сценариях он не работает должным образом

, например, если последовательность 1 и 2 работала нормально, а tab / browser стал неактивным и через некоторое время, если я вернусь кНа этой странице все последующие запросы (которые должны отправляться, когда вкладка неактивна) отправляются одновременно (последовательность 3,4,5,6,7,8,9 и т. д.). Поэтому все эти запросы отправляются.одни и те же данные с одинаковыми значениями долготы, которых не должно быть.

кто-то, пожалуйста, дайте мне знать, что не так с этим потоком.

1 Ответ

0 голосов
/ 29 мая 2018

Ваш код регулируется, когда вкладка не имеет фокуса.Если вы хотите убедиться, что вы не делаете два звонка в течение двух секунд друг от друга, используйте Date.now, чтобы отслеживать, когда вы сделали последний звонок, и не делайте еще один звонок, если он находится в пределах 2000 от текущего Date.now.Например, прямо за пределами вашего обработчика message:

var nextAllowed = Date.now();

, а затем просто внутри него:

if (Date.now() < nextAllowed) {
    return;
}
nextAllowed = Date.now() + 2000;

Несколько замечаний, которые я случайно заметил об этом коде, который вы, возможно, захотитеподумайте об изменении:

  • Нет никакого смысла для этого веб-работника, просто поместите этот цикл таймера в код главной страницы.
  • typeof не является функцией, нетнужно обернуть его операнд в ().
  • Не передавать строки в setTimeout, вместо этого передавать ссылку на функцию.Итак: setTimeout(timedCount, ft);
  • Если у вас нет var объявлений, которые вы не показывали, ваш код становится жертвой того, что я называю Ужас неявных глобалов ,Объявите свои переменные (например, w, sequence и т. Д.).
  • Если ваша конечная точка /api/ правильно определила Content-Type ответа, вам не придется использовать JSON.parse вобратный вызов ajax.В общем, старайтесь, чтобы ответы отправлялись с правильным Content-Type заголовком.
...