jQuery,出一个ajaxQueue

时间:2013-05-27 14:36:03

标签: jquery ajax

我正在使用示例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。 任何建议都非常赞赏。

2 个答案:

答案 0 :(得分:5)

使用clearQueue

ajaxQueue.clearQueue();

修改

问题是可能仍然会调用ajax请求。

所以你可能想跟踪当前的请求:

currentRequest = $.ajax( ajaxOpts );

清除队列时中止这个:

if (currentRequest) {
    currentRequest.abort();
}

请参阅http://jsfiddle.net/4AQ9N/6/

答案 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。它大多数时候都会起作用。