我在 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值的相同数据,这是不应该发生的。
有人请让我知道这个流程有什么问题。答案 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的代码。声明您的变量(例如w
,sequence
等)。/api/
端点正确识别了响应的Content-Type
,则您不必在ajax回调中使用JSON.parse
。一般情况下,尽量确保使用正确的Content-Type
heder发送回复。