Мне также пришлось сделать это в рамках решения, которое у меня было, и я обнаружил, что могу сделать это следующим образом:
//A variable for making sure to wait for multiple clicks before emptying.
var waitingTimeout;
$("a.button").click(function(){
$(this).doAjax(params);
clearTimeout(waitingTimeout);
waitingTimeout = setTimeout(function(){noMoreClicks();},1000);
});
// method
doAjax:function(params){
$(document).queue("myQueueName", function(next){
$.ajax({
type: 'POST',
url: 'whatever.html',
data: params,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){
doStuff;
next();
},
failure: function(data){
next();
},
error: function(data){
next();
}
});
});
}
function noMoreClicks(){
$(document).dequeue("myQueueName");
}
с помощью обратного вызова next()
, который передается в функцию очереди, которую вы можете удалить из очереди.следующая операция.Таким образом, помещая следующее в обработчики для ajax, вы фактически делаете вызовы ajax асинхронными с браузером и потоком рендеринга или рисования браузера, но делаете их синхронными или сериализованными друг с другом.
Вот очень простой пример. В примере скрипта.Нажмите кнопку один раз и подождите секунду.Вы увидите, что срабатывает тайм-аут и происходит одна операция.Затем нажмите кнопку как можно быстрее (или быстрее, чем на одну секунду), и вы увидите, что каждый раз, когда вы нажимаете кнопку, операции ставятся в очередь, а затем только после секундного ожидания они попадают на страницу и исчезают через один раз.другой.
Прелесть этого в том, что, если очередь уже очищается, все операции, которые вы добавляете в нее во время ее опустошения, помещаются в конец, а затем просто обрабатываются, когда придет время.