使用jQuery中止Ajax请求

使用jQuery,如何取消/中止尚未收到响应的Ajax请求

猿蛋蛋凯2020/03/09 19:43:29

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

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

// ↓ prevent page reload by abort()
xhr.onreadystatechange = null;
// ↓ may cause page reload
xhr.abort();
Pro神奇2020/03/09 19:43:29

没有可靠的方法可以执行此操作,一旦请求继续执行,我什至不会尝试。做出合理反应唯一方法是忽略响应。

在大多数情况下,它可能会在以下情况下发生:用户单击按钮的次数过多,从而触发了许多连续的XHR,这里您有很多选择,要么阻塞按钮直到XHR返回,要么在另一个运行提示时不触发新的XHR用户向后倾斜-或放弃任何未决的XHR响应(最近的响应)。

小卤蛋卡卡西2020/03/09 19:43:29

我遇到了轮询问题,一旦页面关闭,轮询就会继续进行,因此,由于我关闭了页面关闭后的下一个50秒钟,因为设置了mysql值,所以用户会错过更新,即使我杀死了ajax请求,我想通了,使用$ _SESSION设置变量将不会在民意测验中对其自身进行更新,直到其结束并且新的民意测验已经开始,因此我所做的是在数据库中将值设置为0 = offpage,轮询我查询该行并返回false;当它为0时,轮询中的查询显然会为您提供当前值...

希望这对您有所帮助

小胖逆天2020/03/09 19:43:29

只需使用ajax.abort()例如,您可以在发送另一个这样的请求之前中止任何待处理的ajax请求

//check for existing ajax request
if(ajax){ 
 ajax.abort();
 }
//then you make another ajax request
$.ajax(
 //your code here
  );
小宇宙Pro2020/03/09 19:43:29

我正在做一个实时搜索解决方案,需要取消可能花费比最新/最新请求更长的请求。

就我而言,我使用的是这样的:

//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 
GOJim2020/03/09 19:43:29

最好总是这样做。

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,那就更好了。

逆天Stafan2020/03/09 19:43:29

将您进行的调用保存在一个数组中,然后对每个调用xhr.abort()。

巨大的注意事项:您可以中止请求,但这只是客户端。服务器端可能仍在处理请求。如果您将PHP或ASP之类的数据用于会话数据,则会话数据将被锁定,直到ajax完成。因此,要允许用户继续浏览网站,必须调用session_write_close()。这将保存会话并解锁它,以便其他等待继续的页面将继续。如果没有此功能,则可能有几页正在等待删除锁。

TomMandy2020/03/09 19:43:29

这是一个异步请求,这意味着一旦它被发送出去就可以了。

万一您的服务器由于AJAX请求而开始非常昂贵的操作,您最好的办法是打开服务器以侦听取消请求,然后发送一个单独的AJAX请求来通知服务器停止其正在执行的操作。

否则,只需忽略AJAX响应。

布雷西2020/03/09 19:43:29

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

jsFiddle上的演示

Stafan西门2020/03/09 19:43:29

您无法撤回该请求,但可以设置一个超时值,在此之后将忽略响应。请参阅此页面以获取jquery AJAX选项。我相信如果超过超时时间,就会调用您的错误回调。每个AJAX请求都已经存在默认超时。

您也可以在请求对象上使用abort()方法,但是,尽管这将导致客户端停止侦听该事件,但它可能不会阻止服务器对其进行处理。