使用jquery的多个ajax请求

时间:2011-01-13 12:50:05

标签: jquery ajax

我遇到了Javascript / JQuery的异步特性问题。

让我们说以下(没有延迟计算,为了不让它如此麻烦);

我在页面上有三个按钮(A,B,C),每个按钮都会将一个项目添加到购物车中,每个按钮都有一个ajax请求。 如果我在服务器端脚本(PHP)中故意延迟5秒并按下1秒钟的按钮,我希望结果如下:

Request A, 5 seconds
Request B, 6 seconds
Request C, 7 seconds

然而,结果是这样的

Request A, 5 seconds
Request B, 10 seconds
Request C, 15 seconds

这必须意味着请求排队而不是同时运行,对吧?这与异步是否相反?我还尝试在url中添加一个随机的get参数,以强制请求一些唯一性,但没有运气。

我确实读了一下这个。如果您避免使用相同的“请求对象(?)”,则不会出现此问题。是否可以在JQuery中强制执行此行为?

这是我正在使用的代码

 $.ajax(
 {
  url   : strAjaxUrl + '?random=' + Math.floor(Math.random()*9999999999),
  data  : 'ajax=add-to-cart&product=' + product,
  type  : 'GET',
  success  : function(responseData)
  {
   // update ui
  },
  error  : function(responseData)
  {
   // show error
  }
 });

我也尝试了GET和POST,没有区别。

我希望在单击按钮时立即发送请求,而不是在上一个请求完成时发送。我希望请求同时运行,而不是在队列中运行。

5 个答案:

答案 0 :(得分:8)

好的,我会尝试,我认为你需要一个更好的方式来记录时间。我不知道你现在在做什么来测试时间,但这是一个好方法。

如果您还没有使用Firebug for Firefox。

打开Firebug并转到网络标签。确保启用它。

当你点击每个按钮时,你会看到每个请求都进来。如果你点击每个按钮,你看不到下一个请求开始,直到上一个请求结束,然后这告诉我javascript中有问题。但是,我猜你应该把每个酒吧的开头分开1秒。这样做,让我们知道你看到了什么。

修改

我想我发现你有问题。我猜你在php中使用睡眠功能。睡眠功能为当前会话休眠。如果你打开3个标签,并放入ajax网址,你会发现同样的行为。 5,10,然后15s为每个标签完成。我尝试谷歌搜索,并发现与其他人相同的结果。这可能是因为PHP并不是真正的多线程。我建议使用不同的框架。

答案 1 :(得分:3)

通过使用session_write_close(),显然可以轻松地通过此行为;用PHP。但是,这可以轻松地为DDos攻击打开。我在10秒钟内按下F5刷新了一页,并且在任何时候杀死了我的计算机。

案件结案。

答案 2 :(得分:0)

根据我的理解,只有当你不在不同的js范围内时,才能进行并行ajax调用。似乎在不同的js范围内使您以序列化方式使用相同的“请求对象”。

所以我们可以在Stack溢出上找到两个关于这个链接的优秀响应,看到第二个响应带有并行查询堆栈对象,这是你需要的东西,在这个并行堆栈上添加你的请求它们真的会得到并行触发(堆栈溢出是网络中最好的站点:-))。 Parallel asynchronous Ajax requests using jQuery

答案 3 :(得分:0)

并发Ajax请求的数量有限制。见这个

How many concurrent AJAX (XmlHttpRequest) requests are allowed in popular browsers?

看起来它依赖于浏览器。

鲍勃

答案 4 :(得分:0)

您无法同时执行此操作,因为一个浏览器UI线程导致JS具有伪异步操作。但是你可以尝试Web Workers,这是执行代码超出浏览器UI线程的方法。他们已经支持Firefox 3.5,Chrome 3和Safari 4。 也许它会提高您的应用程序可用性