我正在使用示例Queueing something like Ajax Calls中提到的ajaxQueue:
// jQuery on an empty object, we are going to use this as our queue
var ajaxQueue = $({});
$.ajaxQueue = function( ajaxOpts ) {
// Hold the original complete function.
var oldComplete = ajaxOpts.complete;
// Queue our ajax request.
ajaxQueue.queue(function( next ) {
// Create a complete callback to fire the next event in the queue.
ajaxOpts.complete = function() {
// Fire the original complete if it was there.
if ( oldComplete ) {
oldComplete.apply( this, arguments );
}
// Run the next query in the queue.
next();
};
// Run the query.
$.ajax( ajaxOpts );
});
};
我还有一个函数来进行Ajax调用并将结果附加到div(简化):
function ajaxCall() {
$.ajaxQueue({
type: "POST",
url: myURL,
async: true,
cache: false,
success: function( result ) {
$('#divID').append($('<div/>').html($(result).html()).fadeIn(200));
}
});
}
然后在点击事件中,我循环执行ajax调用(简化):
$("#btn").on("click", function() {
// ( ??? ) Dequeue the ajaxQueue
$('#divID').html(''); // Clear current results
for(var i=0; i<15; i++) {
ajaxCall();
}
});
问题
如果用户在队列仍在运行时单击链接,则会添加一个新的ajax调用队列,从而产生比预期更多的结果。在新循环开始之前,我需要在点击时清除队列。
这是jsFiddle Demo。 任何建议都非常赞赏。
答案 0 :(得分:5)
使用clearQueue:
ajaxQueue.clearQueue();
修改强>
问题是可能仍然会调用ajax请求。
所以你可能想跟踪当前的请求:
currentRequest = $.ajax( ajaxOpts );
清除队列时中止这个:
if (currentRequest) {
currentRequest.abort();
}
答案 1 :(得分:2)
你需要
ajaxQueue.queue("fx", []); // fx is defualt queue Name.
参见 DEMO
success: function( result ) {
if(num!=0){
$('#divID').append($('<div/>').html('Result '+num).fadeIn(300));
}
num++;
}
$("#btn").on("click", function(e) {
e.preventDefault();
if(ajaxQueue.queue().length>0){
num = 0;
ajaxQueue.queue("fx", []);
}else{
num = 1;
}
$('#divID').html(''); // Clear current results
for(var i=0; i<40; i++) {
ajaxCall();
}
});
在这里你可能会看到1个额外的输出...即。但是,由于排队不能正常工作......当你Clear the queue
已经有一个ajax呼叫已经放置......等待响应。
队列完成后收到响应。
我添加了更新的代码,带有一些num值hack。它大多数时候都会起作用。