jqXHR.abort() 不取消请求但导致浏览器无响应

Posted

技术标签:

【中文标题】jqXHR.abort() 不取消请求但导致浏览器无响应【英文标题】:jqXHR.abort() not cancelling the request but causing the browser to be unresponsive 【发布时间】:2015-05-25 06:38:55 【问题描述】:

我有一个 jQuery 对话框,我在进行 ajax 调用时使用它。我希望能够在对话框关闭时中止当前请求。为此,我定义了一个名为 currentRequest 的全局变量,每次设置 ajax 请求时,我都会将其分配给该变量。在对话框的关闭事件中,我检查currentRequst 是否不等于undefined,如果是,我调用currentRequst.abort()。但这似乎不起作用,因为我无法重新加载页面。我必须等到接收响应所需的时间过去。这是对话的一部分:

...
 close:function(event,ui)dialogClosehandler();
...

function dialogClosehandler()
  alert('Dialog is closed');
 if(currentRequest!=undefined)
    currentRequest.abort();

正如我所说,这不起作用。但是,如果我在设置 ajax 调用时正确中止它,那么它就可以工作。

currentRequest=$.ajax(
    url: "/GetData",
    type: 'POST',
    data:  ,
    contentType: 'application/json',
    dataType: 'json',
).abort();

注意.abort()

我有什么遗漏吗?

编辑:我认为我需要进一步扩展问题。我没有任何问题,例如只提醒你好的按钮或将用户带到 google.com 的链接。但是假设我点击了一个发出另一个 ajax 请求的按钮,或者尝试提交表单,所以任何会向服务器发送请求的东西,在这种情况下,除非经过一段时间,否则它不会有任何效果。

EDIT 2出于测试目的,我创建了 2 个函数:

currentXHR=null;

function startAjax()
  var url="/StartAjax";
  currenXHR=$.get(url,,function()alert('Ajax launched'););


function cancelAjax()
  currentXHR.abort();

这是服务器端方法(它是 C#,ASP.NET MVC):

    public void StartAjax()
    
        System.Threading.Thread.Sleep(10000);
    

我有两个按钮,分别命名为开始和取消。当我单击开始并等待响应时,我在 10 秒后收到“Ajax 启动”警报。但是,如果我在开始请求后立即单击取消,我最终不会收到任何警报,但除非经过 10 秒,否则我仍然无法刷新页面。如您所见,ajax 请求是异步的(否则我将无法单击取消按钮),因此此问题与其他问题有关。

【问题讨论】:

您只能在请求发送到服务器之前中止请求,这意味着您通常有几毫秒的时间来中止它。一旦发送,就无法取回或停止它,最好的希望是永远不会调用回调,但服务器会收到调用。 您对此有何看法? ***.com/a/4551178/751796 我需要说什么吗,它说的是同一件事,请求一旦发送就不能真正中止。但这不应该挂起 UI,所以在你没有向我们展示的代码中发生了其他事情 我并不是要避免请求到达服务器。那不是我的目标。我正在尝试停止等待对已发送请求的响应。我能够与 ui 元素进行交互,因此 UI 不会冻结,但它们没有效果。我的意思是我点击浏览器重新加载按钮,直到接收响应所需的时间过去后才会重新加载。我已编辑问题以提供更多详细信息。 无论如何都不应该发生这种情况,除非您将 ajax 请求设置为同步 【参考方案1】:

经过大量挖掘和搜索后,我得出了这样的结论:这是预期的行为,因为尽管 AJAX 请求本身是异步的,但这并不意味着服务器也会在单独的线程上处理此请求。因此,只要主线程忙于处理前一个请求,它就不会继续处理另一个请求。因此,当按下重新加载按钮时,确实会向服务器发送一个新请求,但新请求的响应只有在前一个请求完成后才会返回。所以对我来说,最好的选择是在单独的线程上处理 ajax 请求。这有两个优点:

    由于主线程没有被阻塞,新请求的响应不必等待。 通过使用CancellationToken,我们还可以通知服务器取消对某个请求的响应,从而避免资源浪费。

我认为this article by Rick Anderson 是做到这一点的出色指南。

【讨论】:

以上是关于jqXHR.abort() 不取消请求但导致浏览器无响应的主要内容,如果未能解决你的问题,请参考以下文章

浏览器取消 PUT 请求

Boost asio 获取“错误代码:125 操作已取消”[关闭]

取消 html5 浏览器中的单张图片请求

是啥导致 Android Chrome 上的网络请求被取消

HTTP 请求 PostAsync 与 HttpClient 取消请求或资源暂时不可用

vue axios请求频繁时取消上一次请求