我正在开发发票应用程序.目前我正在使用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
Run Code Online (Sandbox Code Playgroud)
所以我的猜测是服务器正在忙于构建我的发票对象,因此它不会接受新的请求.以下是对此结论的补充:
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');
}
});
Run Code Online (Sandbox Code Playgroud)
当我同时执行这两个呼叫时,快速呼叫将无法完成,直到慢速呼叫完成:
控制台打印:
start slow call
start fast call
end slow call
end fast call
Run Code Online (Sandbox Code Playgroud)
同时做两个使得快速通话需要5秒钟(根据firebug),当只做快速通话时它在150ms内完成
在所有这些之前,我已经猜到,多个ajaxcalls将以并行方式而不是串行方式完成.
abort() function: (having …Run Code Online (Sandbox Code Playgroud)