是否可以使用jQuery取消/中止尚未收到响应的Ajax请求?
当前回答
我遇到了轮询的问题,一旦页面关闭,轮询就继续进行,所以在我的原因中,用户会错过一次更新,因为在页面关闭后的下一个50秒内,mysql值被设置,即使我终止了ajax请求,我还是想了想,使用$_SESSION设置一个var。在轮询结束并开始新的轮询之前,所以我所做的是在数据库中设置一个值为0=offpage,当我轮询时,我查询该行并返回false;当它为0时,轮询中的查询将明显地获得当前值。。。
我希望这有帮助
其他回答
我遇到了轮询的问题,一旦页面关闭,轮询就继续进行,所以在我的原因中,用户会错过一次更新,因为在页面关闭后的下一个50秒内,mysql值被设置,即使我终止了ajax请求,我还是想了想,使用$_SESSION设置一个var。在轮询结束并开始新的轮询之前,所以我所做的是在数据库中设置一个值为0=offpage,当我轮询时,我查询该行并返回false;当它为0时,轮询中的查询将明显地获得当前值。。。
我希望这有帮助
您不能撤回请求,但可以设置超时值,超过该值后将忽略响应。有关jquery AJAX选项,请参阅本页。我相信如果超过超时时间,将调用错误回调。每个AJAX请求都有一个默认超时。
您也可以对请求对象使用abort()方法,但是,虽然它会导致客户端停止侦听事件,但它可能不会阻止服务器处理它。
这是我基于以上许多答案的实现:
var activeRequest = false; //global var
var filters = {...};
apply_filters(filters);
//function triggering the ajax request
function apply_filters(filters){
//prepare data and other functionalities
var data = {};
//limit the ajax calls
if (activeRequest === false){
activeRequest = true;
}else{
//abort if another ajax call is pending
$request.abort();
//just to be sure the ajax didn't complete before and activeRequest it's already false
activeRequest = true;
}
$request = $.ajax({
url : window.location.origin + '/your-url.php',
data: data,
type:'POST',
beforeSend: function(){
$('#ajax-loader-custom').show();
$('#blur-on-loading').addClass('blur');
},
success:function(data_filters){
data_filters = $.parseJSON(data_filters);
if( data_filters.posts ) {
$(document).find('#multiple-products ul.products li:last-child').after(data_filters.posts).fadeIn();
}
else{
return;
}
$('#ajax-loader-custom').fadeOut();
},
complete: function() {
activeRequest = false;
}
});
}
将所做的调用保存在数组中,然后对每个调用调用xhr.art()。
巨大的漏洞:你可以中止请求,但这只是客户端。服务器端可能仍在处理请求。如果您对会话数据使用PHP或ASP之类的东西,那么会话数据将被锁定,直到ajax完成。因此,为了允许用户继续浏览网站,必须调用session_write_close()。这将保存会话并将其解锁,以便等待继续的其他页面将继续。如果没有这一点,可能会有多个页面等待解除锁定。
这是一个异步请求,意味着一旦它被发送,它就在那里。
如果您的服务器由于AJAX请求而启动了一个非常昂贵的操作,那么您所能做的最好就是打开服务器以侦听取消请求,然后发送一个单独的AJAX请求,通知服务器停止它正在做的任何事情。
否则,只需忽略AJAX响应。