J'implémente donc en javascript cette fonctionnalité : lorsque le document est ouvert par l'utilisateur, ses données sont sauvegardées toutes les 10 secondes et lorsque l'utilisateur le ferme, il est sauvegardé une fois de plus. Cela fonctionne apparemment bien. Voici l'implémentation :
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);
});
}
Je me demandais si mon approche était correcte et si elle pouvait conduire à une situation de course dans des circonstances extrêmes, par exemple :
lorsque l'instance savedata() appelée par onDocumentClose() se trouve après l'étape if(!saveagain), l'instance savedata() appelée par le timer précédent de setTimeout() se trouve avant cette étape, elle est donc appelée une fois de plus. Est-ce que cela ou quelque chose de plus bizarre peut arriver ?
Merci d'avance
EDITAR:
Après avoir pris en compte les commentaires de T.J. Crowder et de Bengi, j'ai finalisé le code comme tel :
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);
});
}
Je pense que j'ai géré toutes les occasions maintenant. Je pense que la solution "beingsaved" est égale au compte atomique que T.J Crowder a suggéré.
EDIT2 : Hm, je ne suis pas sûr d'avoir résolu le problème car il peut y avoir un cas où if(beingsaved) est évalué par l'appel setTimeout JUSTE avant que beingsaved soit mis à true par l'appel onDocumentClose. Cela peut-il arriver ?