我怎样才能停止ajax请求(不要等到响应来了)?

时间:2012-01-24 14:51:43

标签: javascript ajax

如果我使用Ajax发送请求并且此请求需要很长时间.....如果我想发送另一个请求我该怎么办?

当前行为第二个请求(我做过)等到第一个请求得到响应。

注意: 我想在整个应用程序上执行此行为(任何新请求立即执行,而不是等待旧的首先完成) 我的应用程序使用(Ajax + PHP + jQuery + Symfony)

假设这是第一个请求需要很长时间:

$.ajax
({
    type: "GET",
    url: url1,
    success: function (html)
    {
       // do some thing  
    }
});

在任何时候,我都希望此请求执行并终止第一个请求。

$.ajax
({
    type: "POST",
    url: url,
    success: function (html)
    {
       // do some thing else 
    }
});

var xhrReq;
xhrReq = $.ajax(...);

// then if you want to stop the rqest and exit use :

 xhrReq.abort();

5 个答案:

答案 0 :(得分:6)

这是一种手动过程,但您可以添加全局xhr对象并在每个请求上对其进行测试。如果readystate正在“加载”,则中止它:

var xhr;
var loadUrl = function(url) {
    if ( xhr && xhr.readyState > 0 && xhr.readyState < 4 ) {
        // there is a request in the pipe, abort
        xhr.abort();    
    }
    xhr = $.get(url, function() {
        console.log('success', this);
    });
};

loadUrl('/ajax/');

答案 1 :(得分:2)

XMLHttpRequest对象具有abort功能。您可以使用setTimeout中止花费太长时间的请求。

编辑:如果你不想使用计时器,并且发生了一个应该中止先前请求的新事件,那么事件处理程序应该执行以下操作

if(!this.request) return;  // request contains the XMLHttpRequest
this.request.onreadystatechange = function() {};
if(this.request.readyState != 4) {
    this.request.abort();
}

然后,您可以创建新的XMLHttpRequest对象。

答案 2 :(得分:1)

我一直致力于这方面的工作,我觉得我找到了一个有效的解决方案。我有一个缓存过程导致页面挂起,直到完成(平均5秒)。是的,这更适合作为CRON工作,但我需要为用户创建缓存过程,而不需要知道他们用于CMS的环境。 我做了什么: 在变量中创建调用,然后通过硬删除将其删除。通过删除它似乎正在删除等待。这&#34; hack&#34;似乎将等待时间从5秒平均拉到325毫秒等待。

var ignore = $.ajax({
    url:something/here.php,
    type: "GET",
    url: url1,
    success: function(){}
});
delete ignore;

答案 3 :(得分:0)

定义ajax请求变量:

var xhr;

拨打ajax电话:

xhr = $.ajax(...);

中止ajax电话:

xhr.abort();

答案 4 :(得分:0)

浏览器允许您每次只处理对同一主机的有限数量的请求(我记得2或3,具体取决于浏览器)。

关于请求计数的解决方法是制作虚假域名 - 例如img1.domain.com,img2.domain.com等,导致同一主机并在请求中随机使用它们。然后你可以提出你需要的请求。应根据请求数量选择域计数以保持边界 - 每个域2个请求。否则,第三个请求将等待一个活动结束。

它允许您接收来自所有请求的回复。 例如,Google使用它来加快图片加载速度。

编辑:

示例:您有http://yourhost.com/和别名http://alias.yourhost.com,它们指向同一个地方。 然后:

$.ajax
({
    type: "GET",
    url: 'http://yourhost.com/somescript.php',
    success: function (html)
    {
       // do some thing  
    }
});

然后

$.ajax
({
    type: "POST",
    url: 'http://alias.yourhost.com/somescript2.php',
    success: function (html)
    {
       // do some thing else  
    }
});