我正在尝试使用ajax调用在服务器端自动保存表单数据。任何输入更改后我开始自动保存20秒。如果正在进行一次自动保存呼叫,我想等待。以下是我正在采取的步骤。我的方法取决于一个javascript全局变量,我担心我可能遇到某种同步问题。还有其他更好的方法吗?
$('input').change(function() {
if (autoSaveInProgress == false) {
//call ajax function in 20secodns.
setTimeout(autoSaveFunction, 20000);
autoSaveInProgress = true;
}
});
我在收到服务器的响应后,在autoSaveFunction中将autoSaveInProgress设置为false。
答案 0 :(得分:0)
我建议使用(jQ)xhr-objects属性,而不是假设前一个调用在20秒后完成,
var saveXhr;
function autoSave(){
if(saveXhr && saveXhr.readyState < 4){
//previous save not completed
//do something, perhaps saveXhr.abort() or prolong the timer
}else{
saveXhr = $.ajax({ /* your save ajax code */ });
}
}
答案 1 :(得分:0)
为避免使用全局范围变量,您可以在遇到change事件的元素上设置属性。我喜欢使用disabled属性。
var disabled = $that.attr('disabled');
if (disabled) {
return false;
}
$(this).attr('disabled', 'disabled');
并重新启用该元素,但您必须将该元素传递到异步闭包中(请参阅小提琴):
$that.removeAttr('disabled');
您还可以更改您的更改选择器:http://jsfiddle.net/eHQbh/