所以我在javascript中实现了这个功能:当用户打开文档时,它的数据每10秒保存一次,当用户关闭时,它会再保存一次。它似乎运作良好。这是实现:
var data = "blabla";
var saveagain = false;
var t1;
function onDocumentOpen() {
saveagain = true;
savedata();
}
function onDocumentClose() {
saveagain = false;
savedata();
}
function savedata() {
if (!saveagain) clearTimeout(t1);
SaveDataAjaxCall(data, function() {
//data was saved
if (saveagain) t1 = setTimeout("savedata()", 10000);
});
}
我想知道我的方法是否正确,以及它是否会在极端情况下导致一些可能的竞争条件,例如:
当从 onDocumentClose() 调用的 savedata() 实例在 if(!saveagain) 步骤之后,从 setTimeout() 的前一个计时器调用的 savedata() 实例在该步骤之前,因此它会被再次调用。这或者更奇怪的事情会发生吗?
提前致谢
编辑:
在考虑了 TJ Crowder 和 Bengi 的评论后,我最终确定了代码:
var data = "";
var saveagain = false;
var t1;
var beingsaved = false;
function onDocumentOpen() {
saveagain = true;
savedata();
}
function onDocumentClose() {
saveagain = false;
savedata();
}
function saveData() {
if (beingsaved) {
if (!saveagain) setTimeout(saveData, 100);
return false;
}
beingsaved=true;
if (!saveagain) clearTimeout(t1);
data=getData();
SaveDataAjaxCall(data, function() {
//data was saved
beingsaved=false;
if (saveagain) t1 = setTimeout(saveData, 10000);
});
}
我想我现在已经处理了每一个场合。我认为被保存的解决方案等于 TJ Crowder 建议的原子计数。
EDIT2:嗯,我不确定我是否解决了它,因为可能存在这样一种情况,即 if(beingsaved) 在 onDocumentClose 调用设置为 true 之前被 setTimeout 调用评估。这会发生吗?