Html Web worker未按预期工作

时间:2018-05-29 10:41:24

标签: javascript html ajax asynchronous web-worker

我在 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 /浏览器变为非活动状态,并且在某个时间后如果我返回到此页面,则所有后续请求(当选项卡处于非活动状态时应该发送)将被发送到同一时间(序列3,4,5,6,7,8,9等)。所有这些请求都发送相同的lat lon值的相同数据,这是不应该发生的。

有人请让我知道这个流程有什么问题。

1 个答案:

答案 0 :(得分:1)

当标签没有焦点时,您的代码会受到限制。如果您希望确保不会在两秒钟内拨打两个电话,请使用Date.now跟踪您上次通话的时间,如果是,则不要再拨打另一个电话在当前Date.now的2000年内。例如,就在message处理程序之外:

var nextAllowed = Date.now();

然后就在里面:

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

我碰巧注意到您可能要考虑更改的代码:

  • 根本不关心那个网络工作者,只需将定时器循环放在主页的代码中。
  • typeof不是函数,不需要在()中包装其操作数。
  • 不要将字符串传递给setTimeout,而是传入函数引用。所以:setTimeout(timedCount, ft);
  • 除非您没有显示var声明,否则您的代码将成为我称之为The Horror of Implicit Globals的代码。声明您的变量(例如wsequence等)。
  • 如果您的/api/端点正确识别了响应的Content-Type,则您不必在ajax回调中使用JSON.parse。一般情况下,尽量确保使用正确的Content-Type heder发送回复。