是否可以使用jQuery取消/中止尚未收到响应的Ajax请求?


当前回答

您不能撤回请求,但可以设置超时值,超过该值后将忽略响应。有关jquery AJAX选项,请参阅本页。我相信如果超过超时时间,将调用错误回调。每个AJAX请求都有一个默认超时。

您也可以对请求对象使用abort()方法,但是,虽然它会导致客户端停止侦听事件,但它可能不会阻止服务器处理它。

其他回答

您不能撤回请求,但可以设置超时值,超过该值后将忽略响应。有关jquery AJAX选项,请参阅本页。我相信如果超过超时时间,将调用错误回调。每个AJAX请求都有一个默认超时。

您也可以对请求对象使用abort()方法,但是,虽然它会导致客户端停止侦听事件,但它可能不会阻止服务器处理它。

如果xhr.art();导致页面重新加载,

然后,您可以在中止前设置onreadystatechange以防止:

// ↓ prevent page reload by abort()
xhr.onreadystatechange = null;
// ↓ may cause page reload
xhr.abort();

没有可靠的方法可以做到这一点,一旦请求得到满足,我甚至不会尝试;唯一合理反应的方法就是忽略反应。

在大多数情况下,这可能会发生在这样的情况下:用户太频繁地点击一个按钮,触发许多连续的XHR,这里有很多选项,要么在XHR返回之前阻止该按钮,要么在另一个正在运行时甚至不触发新的XHR(提示用户向后倾斜),要么丢弃除最近的XHR响应之外的任何未决XHR响应。

这是一个异步请求,意味着一旦它被发送,它就在那里。

如果您的服务器由于AJAX请求而启动了一个非常昂贵的操作,那么您所能做的最好就是打开服务器以侦听取消请求,然后发送一个单独的AJAX请求,通知服务器停止它正在做的任何事情。

否则,只需忽略AJAX响应。

无论是jquery ajax对象还是本机XMLHTTPRequest对象,只需调用xhr.abourt()。

例子:

//jQuery ajax
$(document).ready(function(){
    var xhr = $.get('/server');
    setTimeout(function(){xhr.abort();}, 2000);
});

//native XMLHTTPRequest
var xhr = new XMLHttpRequest();
xhr.open('GET','/server',true);
xhr.send();
setTimeout(function(){xhr.abort();}, 2000);