使用jQuery,如何取消/中止尚未收到响应的Ajax请求?
使用jQuery中止Ajax请求
没有可靠的方法可以执行此操作,一旦请求继续执行,我什至不会尝试。做出合理反应的唯一方法是忽略响应。
在大多数情况下,它可能会在以下情况下发生:用户单击按钮的次数过多,从而触发了许多连续的XHR,这里您有很多选择,要么阻塞按钮直到XHR返回,要么在另一个运行提示时不触发新的XHR用户向后倾斜-或放弃任何未决的XHR响应(最近的响应)。
我遇到了轮询问题,一旦页面关闭,轮询就会继续进行,因此,由于我关闭了页面关闭后的下一个50秒钟,因为设置了mysql值,所以用户会错过更新,即使我杀死了ajax请求,我想通了,使用$ _SESSION设置变量将不会在民意测验中对其自身进行更新,直到其结束并且新的民意测验已经开始,因此我所做的是在数据库中将值设置为0 = offpage,轮询我查询该行并返回false;当它为0时,轮询中的查询显然会为您提供当前值...
希望这对您有所帮助
只需使用ajax.abort()例如,您可以在发送另一个这样的请求之前中止任何待处理的ajax请求
//check for existing ajax request
if(ajax){
ajax.abort();
}
//then you make another ajax request
$.ajax(
//your code here
);
我正在做一个实时搜索解决方案,需要取消可能花费比最新/最新请求更长的请求。
就我而言,我使用的是这样的:
//On document ready
var ajax_inprocess = false;
$(document).ajaxStart(function() {
ajax_inprocess = true;
});
$(document).ajaxStop(function() {
ajax_inprocess = false;
});
//Snippet from live search function
if (ajax_inprocess == true)
{
request.abort();
}
//Call for new request
最好总是这样做。
var $request;
if ($request != null){
$request.abort();
$request = null;
}
$request = $.ajax({
type : "POST", //TODO: Must be changed to POST
url : "yourfile.php",
data : "data"
}).done(function(msg) {
alert(msg);
});
但是,如果检查一条if语句来检查ajax请求是否为null,那就更好了。
将您进行的调用保存在一个数组中,然后对每个调用xhr.abort()。
巨大的注意事项:您可以中止请求,但这只是客户端。服务器端可能仍在处理请求。如果您将PHP或ASP之类的数据用于会话数据,则会话数据将被锁定,直到ajax完成。因此,要允许用户继续浏览网站,必须调用session_write_close()。这将保存会话并解锁它,以便其他等待继续的页面将继续。如果没有此功能,则可能有几页正在等待删除锁。
这是一个异步请求,这意味着一旦它被发送出去就可以了。
万一您的服务器由于AJAX请求而开始非常昂贵的操作,您最好的办法是打开服务器以侦听取消请求,然后发送一个单独的AJAX请求来通知服务器停止其正在执行的操作。
否则,只需忽略AJAX响应。
AJAX请求可能无法按启动顺序完成。除了放弃最近的响应之外,您还可以选择忽略所有AJAX响应:
- 创建一个柜台
- 发起AJAX请求时增加计数器
- 使用计数器的当前值“标记”请求
- 在成功回调中,将图章与计数器进行比较,以检查它是否是最新请求
代码粗略概述:
var xhrCount = 0;
function sendXHR() {
// sequence number for the current invocation of function
var seqNumber = ++xhrCount;
$.post("/echo/json/", { delay: Math.floor(Math.random() * 5) }, function() {
// this works because of the way closures work
if (seqNumber === xhrCount) {
console.log("Process the response");
} else {
console.log("Ignore the response");
}
});
}
sendXHR();
sendXHR();
sendXHR();
// AJAX requests complete in any order but only the last
// one will trigger "Process the response" message
如果
xhr.abort();
导致页面重新加载,然后,您可以
onreadystatechange
在中止之前进行设置以防止: