だから私は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);
});
}
私は今、あらゆる機会に対応してきたと思います。beingsaved の解決策は、TJ Crowder が提案したアトミック カウンターと同じだと思います。
EDIT2: うーん、onDocumentClose 呼び出しによって beingsaved が true に設定される直前に、setTimeout 呼び出しによって if(beingsaved) が評価される場合があるため、解決したかどうかはわかりません。これは起こりえますか?