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

时间:2015-05-25 06:38:55

标签: jquery ajax abort

我有一个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请求,或尝试提交表单,所以任何会向服务器发送请求,在这种情况下它不会有任何影响,除非一些时间过去了。

编辑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);
    }

我有两个名为start和cancel的按钮。当我点击开始并等待响应时,我得到了#34; Ajax已启动" 10秒后警报。但是,如果我在启动请求后立即点击取消,我最后不会收到任何提醒,但除非经过10秒,否则我无法刷新页面。正如您所看到的,ajax请求是异步的(否则我无法单击取消按钮),因此此问题与其他内容有关。

1 个答案:

答案 0 :(得分:0)

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

  1. 由于主要线程未被阻止,因此新请求的响应不必等待。
  2. 通过使用CancellationToken,我们还可以通知服务器取消处理某个请求的响应,从而避免浪费资源。
  3. 我认为this article by Rick Anderson是一个很好的指南。