2012-07-24 108 views
2

Corey Frang在stackoverflow上发布了一个有用的插件,用于排队ajax请求。就我而言,用“大块”加载大量数据是非常有用的,以减少用户感知的慢度。除非在ajax请求的队列完成之前触发分页事件,否则这种情况完美地起作用,在这种情况下,持有加载对象的容器将清除,但排队的请求将继续运行,从而导致不希望的行为。我想要的是找到/学习清除所有现有请求队列的方法。开发人员发布了一种方法来执行此操作,但它似乎不起作用。我试着在jQuery网站上阅读.queue,但我似乎无法理解如何使这项工作。我已经花了很多时间来解决这个问题,但也许我对jQuery的一些更复杂的方面的熟悉程度让我难以接受。希望有人在那里谁更熟悉的jQuery能帮助:)(标记什么建议并没有出现一些工作“!!!!!”)jQuery“队列”(ajaxQueue插件) - 如何清除?

/* 
* jQuery.ajaxQueue - A queue for ajax requests 
* 
* (c) 2011 Corey Frang 
* Dual licensed under the MIT and GPL licenses. 
* 
* Requires jQuery 1.5+ 
*/ 
(function($) { 

// jQuery on an empty object, we are going to use this as our Queue 
var ajaxQueue = $({}); 

$.ajaxQueue = function(ajaxOpts) { 
    var jqXHR, 
     dfd = $.Deferred(), 
     promise = dfd.promise(); 

    // queue our ajax request 
    ajaxQueue.queue(doRequest); 

    // add the abort method 
    promise.abort = function(statusText) { 

     // proxy abort to the jqXHR if it is active 
     if (jqXHR) { 
      return jqXHR.abort(statusText); 
     } 

     // if there wasn't already a jqXHR we need to remove from queue 
     var queue = ajaxQueue.queue(), 
      index = $.inArray(doRequest, queue); 

     if (index > -1) { 
      queue.splice(index, 1); 
     } 

     // and then reject the deferred 
     dfd.rejectWith(ajaxOpts.context || ajaxOpts, 
      [ promise, statusText, "" ]); 

     return promise; 
    }; 

    // run the actual query 
    function doRequest(next) {   
     jqXHR = $.ajax(ajaxOpts) 
      .then(next, next) 
      .done(dfd.resolve) 
      .fail(dfd.reject); 
    } 

    return promise; 
}; 

// !!!!!!!!!!!!!!!!! 
// this is what the developer suggested on his website in the comments section 
// ... but it does not appear to work 
$.ajaxQueue.stop = function(clear) { ajaxQueue.stop(clear); } 

})(jQuery); 
+0

的....? – Luceos 2012-07-24 12:15:55

+0

不完整的问题? :) – Dipak 2012-07-24 12:16:04

+1

我的坏家伙 - 意外地在输入标签时点击“输入”键,现在将其他标签贴出:) – Eva 2012-07-24 12:23:15

回答

1

感谢您为帮助我解决问题所做的努力。然而..

我发现了一个更好的ajax队列插件 - Oleg Podolsky的“ajaxq”,如果你需要排队ajax请求(以及正确清除队列的能力),我推荐使用它。

添加到队列:

ajaxq('queue_name', { 
    // standard $.ajax options 
}); 

停止/清除队列:

ajaxq('queue_name'); 

插件:

/* 
* jQuery AjaxQ - AJAX request queueing for jQuery 
* 
* Version: 0.0.1 
* Date: July 22, 2008 
* 
* Copyright (c) 2008 Oleg Podolsky ([email protected]) 
* Licensed under the MIT (MIT-LICENSE.txt) license. 
* 
* http://plugins.jquery.com/project/ajaxq 
* http://code.google.com/p/jquery-ajaxq/ 
*/ 

jQuery.ajaxq = function (queue, options) 
{ 
    // Initialize storage for request queues if it's not initialized yet 
    if (typeof document.ajaxq == "undefined") document.ajaxq = {q:{}, r:null}; 

    // Initialize current queue if it's not initialized yet 
    if (typeof document.ajaxq.q[queue] == "undefined") document.ajaxq.q[queue] = []; 

    if (typeof options != "undefined") // Request settings are given, enqueue the new request 
    { 
     // Copy the original options, because options.complete is going to be overridden 

     var optionsCopy = {}; 
     for (var o in options) optionsCopy[o] = options[o]; 
     options = optionsCopy; 

     // Override the original callback 

     var originalCompleteCallback = options.complete; 

     options.complete = function (request, status) 
     { 
      // Dequeue the current request 
      document.ajaxq.q[queue].shift(); 
      document.ajaxq.r = null; 

      // Run the original callback 
      if (originalCompleteCallback) originalCompleteCallback (request, status); 

      // Run the next request from the queue 
      if (document.ajaxq.q[queue].length > 0) document.ajaxq.r = jQuery.ajax (document.ajaxq.q[queue][0]); 
     }; 

     // Enqueue the request 
     document.ajaxq.q[queue].push (options); 

     // Also, if no request is currently running, start it 
     if (document.ajaxq.q[queue].length == 1) document.ajaxq.r = jQuery.ajax (options); 
    } 
    else // No request settings are given, stop current request and clear the queue 
    { 
     if (document.ajaxq.r) 
     { 
      document.ajaxq.r.abort(); 
      document.ajaxq.r = null; 
     } 

     document.ajaxq.q[queue] = []; 
    } 
} 
在这种情况下
+0

你可以给如何取消这个插件队列的提示?谢谢 – Flores 2013-02-22 09:48:04

+0

^编辑答案,应该这样做 – Eva 2013-02-27 05:54:47

1

从我所看到的问题似乎是:

var ajaxQueue = $({}); 

ajaxQueue只是一个空的对象,停止使用,你需要把它指向的jQuery插件

ajaxQueue.stop = function(clear) { $.ajaxQueue.stop(clear); } 

,或者只是对象使用:

$.ajaxQueue.stop(clear); 
+0

您建议的“正确使用”部分效果很好..不知道为什么我有这样的困难时间,但非常感谢你:) – Eva 2012-08-26 17:08:04

+0

嗯 - 我已经授予赏金,但我应该注意,这个解决方案实际上不起作用(返回“无方法”错误)。我会在找到它时发布解决方案。 – Eva 2012-08-26 17:58:38

+0

请让我知道为什么这第一次工作,2分钟后不工作。也许我可以帮助一些,我认为你可以撤消赏金 – cuzzea 2012-08-26 18:52:53

1

我在ajaxQueue代码中增加了这个函数。这可能不是有效的,但它通过清除队列来完成工作:

if (ajaxOpts=='clear'){ 
    ajaxQueue.clearQueue(); 
    return promise; 
} 
+0

这似乎并不工作(刚刚尝试它),我会尽快得到一个小提琴,但非常感谢你的答案尝试:) – Eva 2012-09-26 21:14:58