Ваша проблема в том, что .ajax()
запускает асинхронный запущенный Ajax-запрос.Это означает, что .ajax()
возвращается немедленно, без блокировки.Таким образом, вы ставите в очередь функции, но они будут запускаться почти одновременно, как вы описали.
Я не думаю, что .queue()
- это хорошее место для приема ajax-запросов, оно больше предназначено для использованияfx methods
.Вам нужен простой менеджер.
var ajaxManager = (function() {
var requests = [];
return {
addReq: function(opt) {
requests.push(opt);
},
removeReq: function(opt) {
if( $.inArray(opt, requests) > -1 )
requests.splice($.inArray(opt, requests), 1);
},
run: function() {
var self = this,
oriSuc;
if( requests.length ) {
oriSuc = requests[0].complete;
requests[0].complete = function() {
if( typeof(oriSuc) === 'function' ) oriSuc();
requests.shift();
self.run.apply(self, []);
};
$.ajax(requests[0]);
} else {
self.tid = setTimeout(function() {
self.run.apply(self, []);
}, 1000);
}
},
stop: function() {
requests = [];
clearTimeout(this.tid);
}
};
}());
Это далеко от того, чтобы быть идеальным, я просто хочу продемонстрировать, как идти дальше.Приведенный выше пример может быть использован как
$(function() {
ajaxManager.run();
$("a.button").click(function(){
ajaxManager.addReq({
type: 'POST',
url: 'whatever.html',
data: params,
success: function(data){
// do stuff
}
});
});
});