如果我使用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();
答案 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
}
});