Corey Frang 在 stackoverflow 上发布了一个有用的插件,用于对 ajax 请求进行排队。在我的例子中,它对于在“块”中加载大量数据以最大程度地减少用户感知的速度非常有用。它完美地工作,除非在 ajax 请求队列完成之前触发分页事件,在这种情况下,保存已加载对象的容器将清除,但排队的请求将继续运行,从而导致不良行为。我想要的是找到/学习一种清除所有现有请求队列的方法。开发人员发布了一种方法来做到这一点,但是,它似乎不起作用。我已经尝试在 jQuery 网站上阅读 .queue,但我似乎无法理解如何使这项工作。我已经花了很多时间试图弄清楚这个问题,但也许我对 jQuery 的一些更复杂的方面缺乏熟悉让我退缩了。希望更熟悉jQuery的人可以提供帮助:)(标记了建议的内容,并且似乎不适用于某些“!!!!!”)
/*
* 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);