ExtJS 4中同时运行多个ajax请求问题

6

问题

我有一个长时间运行的导入作业,我用ajax请求启动它,可能需要几分钟才能完成请求。当第一个ajax请求正在运行时,我想查看服务器以知道导入的进度,这个第二个请求将每2秒钟左右完成一次。

当我使用Ext.Ajax方法时,请求似乎被链接在一起 - 第一个ajax请求(导入)一直运行到完成,然后才触发第二个(导入更新)。

我看到Ext.Ajax是单例的,所以可能这就是原因。所以我尝试用Ext.create('Ext.data.Connection')创建自己的连接对象,但它不起作用。

当前请求链是:

  • 第一个请求-开始
  • 第一个请求-结束
  • 第二个请求-开始
  • 第二个请求-结束

但是它应该是:

  • 第一个请求-开始
  • 第二个请求-开始
  • 第二个请求-结束
  • ...可能会有更多的第二个请求
  • 第一个请求-结束

问题

浏览器应该能够处理多个请求,但在ExtJS中必须有限制,但我没有找到它在哪里?


更新2011-10-16

答案

问题不在于ExtJS - 对不起!这是PHP的问题,我的第一个脚本使用会话,第二个脚本也试图访问会话。因为PHP会话是基于文件的,所以第一个请求脚本锁定了会话文件,第二个请求脚本必须等待第一个释放会话锁。

我通过在导入过程中(第一个脚本)添加以下代码来解决这个问题:

 $id = session_id();
 session_write_close();
 sleep(1);
 session_start($id);

所以它停止并重新加载会话,另一个脚本能够钩入并获取会话信息。


+1 对于这个信息。从来不知道会话锁的事情 :) - Lionel Chan
太棒了。我遇到了完全相同的问题,但我没有意识到是会话锁引起的混乱。 - Caballero
1个回答

5

无论是单例还是非单例,都不会改变Ext.Ajax的工作方式。我认为这可能是由于代码编写(你是否等待调用完成)引起的。

据我所知,当我进行多个调用时,以前从未出现过这个问题。唯一占用调用的事情是服务器(PHP),它不支持并行处理并导致延迟,并生成以下模式:

  • 调用1 - 开始
  • 调用2 - 开始
  • 调用1在服务器中得到处理并且调用2排队
  • 调用1 - 完成
  • 调用2在服务器中得到处理
  • 调用2 - 完成

如果调用1需要比调用2更长的时间来处理,这可能是灾难性的。

编辑:

我写了这个小演示,让你感受一下它的工作原理。看看吧 :) 花了我半小时呢!


编辑:添加了一个漂亮的小图表 :) - Lionel Chan
哇!太谢谢了伙计!做得很棒,真是太棒了!而且你说得对 - 是服务端出问题了,我遇到了一个PHP的问题(会话锁定),我没注意到,我会更新我的问题并附上答案。顺便说一下,我之前不知道这个酷炫的jsfiddle,从现在开始我会经常用它了! - Marc
欢迎!只需在堆栈中传播即可。这对于程序员分享问题和答案来说要容易得多。 - Lionel Chan
谢谢。刚刚有些额外时间可以做一些小型编码 :) - Lionel Chan
你分享了jsfiddle,我已经用过了 :) http://stackoverflow.com/questions/7912596/async-call-in-jquery/7912707#7912707 - Marc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接