Я думаю, то, как вы справляетесь с этим, лучше всего подходит для вашей ситуации. Используя этот флаг, вы гарантируете, что асинхронные вызовы не перекрываются. Я также имел дело с асинхронными вызовами к серверу, а также использовал какой-то флаг, чтобы предотвратить наложение.
Как уже отмечали другие, JavaScript является однопоточным, но асинхронные вызовы могут быть сложными, если вы ожидаете, что вещи скажут то же самое или не произойдут во время обратной передачи на сервер.
Одна вещь, однако, в том, что я не думаю, что вам действительно нужно отключить автосохранение. Если автоматическое сохранение пытается произойти, когда пользователь сохраняет, то метод сохранения просто вернется, и ничего не произойдет. С другой стороны, вы без необходимости отключаете и снова включаете автосохранение каждый раз, когда автосохранение активируется. Я бы рекомендовал перейти на setInterval, а затем забыть об этом.
Кроме того, я сторонник минимизации глобальных переменных. Я, вероятно, реорганизовал бы ваш код следующим образом:
var saveWork = (function() {
var isSaving=false;
var timeoutId;
var timeoutInterval=300000;
function endSave() {
isSaving=false;
//hides popup if it's visible
}
function endSaveError() {
alert("Ooops");
endSave();
}
function _save(showMsg) {
//Don't save if we are already saving.
if (isSaving)
{
return;
}
isSaving=true;
if (showMsg) { //show a saving popup}
params=CollectParams();
PerformCallBack(params,endSave,endSaveError);
}
return {
save: function(showMsg) { _save(showMsg); },
enableAutoSave: function() {
timeoutId=setInterval(function(){_save(false);},timeoutInterval);
},
disableAutoSave: function() {
cancelTimeOut(timeoutId);
}
};
})();
Вы, конечно, не должны подвергать его рефакторингу, но, как я уже сказал, мне нравится минимизировать глобальные переменные. Важно то, что все это должно работать без отключения и повторного включения автосохранения при каждом сохранении.
Редактировать: Забыл, чтобы создать личную функцию сохранения, чтобы иметь возможность ссылаться из enableAutoSave