如何打破悬挂的ajax调用并加载另一个页面

时间:2011-03-11 11:01:30

标签: php jquery ajax session

我正在开发发票应用。目前我正在使用OO php来构建发票对象。 对象本身包含客户,产品,发票详细信息,公司的对象。

现在我正在编写一个页面来进行概述。发生的问题是,当我有太多的发票(仅用1500个虚拟发票进行测试,其中的时间可能会更多)时,php对象的构建大约需要7秒钟。我觉得这太长了,因为这只是一个请求。此外,由于php运行服务器端,因此页面在对象全部构建之前没有加载任何内容。 我盯着一个空屏幕7秒钟,然后瞬间得到了所有东西(所有这些都在本地主机上,所以在线它应该更糟)。

由于页面需要更多功能,因此只需进行概述(即:创建新发票,使用过滤器缩小显示的发票),我不希望用户需要等待发票的构建在他们可以使用其他功能之前,我改变了页面的工作方式。

现在我首先加载我的基本html结构,然后使用$ .ajax()调用开始获取发票数据。我构建了一个ajax_loader来通知用户发生了什么。呼叫完成后,会显示数据,但我仍然遇到用户无法执行任何操作的问题。他可以点击一个链接/按钮,但是在我的ajax调用完成之前它不会“动作”。一旦通话完成,一切正常。在有活动呼叫时单击链接确实会注册“click”事件,但触发仅在ajax完成时发生。

问题与我同步的ajax调用无关。如果有人对如何克服这个问题有任何建议,我将非常感谢他们。 我的第一个想法是取消ajaxcalls但是从我读到的内容到现在为止我怀疑abort()函数不能完成任务。

修改 做一些更多的试用,我注意到ajaxcalls仍在运行时一切正常,除了从我自己的网站(域,服务器或我应该调用它)加载页面 或者做任何涉及同一服务器的其他ajaxcall 即:

$("#dummyButton").click(function(){  
window.location='http://www.google.com' //works  
window.location='index.php'  //doesn't work  
alert("test"); //works  
console.log("test"); //works    
})

a href='http://www.google.com'  //works  
a href='index.php' //doesnt work 

所以我的猜测是服务器正在忙于构建我的发票对象,因此它不会接受新的请求。 以下是对此结论的补充:

   console.log("start slow call");  
    slow = $.ajax({  
        a very slow/heavy call  
        success:function(){  
            console.log('end slow call');  
        }  
    });  
    console.log('start fast call');  
    quick = $.ajax({  
        a very quick/lightweight call  
        success: function(){  
            console.log('end fast call');  
        }  
    });  

当我同时进行这两次通话时,快速通话将在慢速通话完成后完成:

控制台打印:

start slow call  
start fast call  
end slow call  
end fast call
同时做两个快速调用需要5秒钟(根据firebug),当只做快速调用时它会在150ms内完成

在所有这些之前,我已经猜到多个ajaxcalls将以并行方式而不是串行方式完成。

abort() function: (having my 2 ajaxcalls as globals so i can abort them);  

$("a[href]").click(function(){  
    slow.abort();  
    quick.abort();  
    window.location = "index.php";  
    return false;  
})  

使ajaxcalls中止,但仍然是服务器继续执行来自两个调用的代码,因此它不会接受我的请求转到index.php,直到来自ajaxcalls的serversidecode完成。
大约5秒后(在头部计算)我的index.php将开始加载

因此,我想到了以下问题:

是否有任何可管理的方法可以取消服务器为该特定客户端运行的所有进程?

其他没有最终成为根本原因的想法:

我已经调整了我的发票构造函数,传递了一个布尔值来确定对象是否需要所有信息,或者只是基本信息。这使得我的ajaxcall(或更好的特定ajaxcall背后的服务器端进程)大约缩短了3秒(在1500个虚拟发票上)。我可以调整数据库,因此在已开发的东西上调整很多其他东西。或者,因为构建所有发票对象是耗时的部分,我可以用非OO方式进行吗?

这让我感到很难过:这是我的第一个真正的OOP项目,它易于使用,但显然在处理大量对象时计算时间有很多麻烦。

1 个答案:

答案 0 :(得分:5)

嘿,我刚刚快速阅读了你的问题 - 所以我正在跳楼,我的回答并非如此。

当你一次调用两个php请求而一个不会在另一个之前完成时,快速请求有可能在慢速请求关闭之前无法启动会话(session_start())。

如果在开始任何漫长的过程之前不再需要,请尝试closing the session