jquery - 使用 jQuery.queue() 对 ajax 请求进行队列

标签 jquery ajax queue

我是第一次使用 jQuery.queue(),还没有完全掌握它。 有人可以指出我做错了什么吗?

查看 firebug,我仍然看到我的 POST 请求同时触发 - 所以我想知道我是否在错误的位置调用 dequeue()。

另外 - 我怎样才能获得队列长度?

我需要对这些请求进行排队的原因是它会在单击按钮时被触发。用户可以快速连续单击多个按钮。

尝试剥离我的代码的基本结构:

$("a.button").click(function(){
   $(this).doAjax(params);
});

// method
doAjax:function(params){ 

   $(document).queue("myQueueName", function(){
     $.ajax({
       type: 'POST',
       url: 'whatever.html',
       params: params,
       success: function(data){
         doStuff;

         $(document).dequeue("myQueueName");
       }
     });
   });

}

最佳答案

这里的问题是,.ajax() 触发异步运行的 Ajax 请求。这意味着,.ajax() 立即返回,非阻塞。因此,您对功能进行了排队,但它们几乎会像您所描述的那样同时触发。

我不认为 .queue() 是放置 ajax 请求的好地方,它更适合使用 fx 方法。您需要一个简单的经理。

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
           }
       });
    });
});

关于jquery - 使用 jQuery.queue() 对 ajax 请求进行队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4785724/

相关文章:

javascript - Jquery 事件在 ajax 调用后绑定(bind)两次

php - 如何在页面加载时使用 ajax 将 php include 加载到页面中

javascript - 自动登录

azure - 集成测试连接到服务总线队列的 Azure 函数应用程序

javascript - 隐藏显示 div 在基于单独的 div 的两个地方不起作用

javascript - 组合多个元素并将结果附加到一个 div

c# - 为什么在 C# 中 Queue 对其元素中的数据进行加扰?

javascript - .queue() 和 jquery.queue() 之间的区别

javascript - 如何让 "onclick"内容显示在动态创建的内容旁边

javascript - jQuery AJAX 调用返回 [object Object]