【问题标题】:multiple ajax requests with jquery使用 jquery 的多个 ajax 请求
【发布时间】:2011-06-08 11:46:31
【问题描述】:

我遇到了 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 添加一个随机获取参数,以强制请求具有一些唯一性,但没有运气。

我确实读过一些关于此的内容。如果您避免使用相同的“请求对象 (?)”,则不会出现此问题。是否可以在 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,没有区别。

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

【问题讨论】:

  • 你能在这里发布你的javascript代码吗?默认情况下$.ajax 是异步的
  • @Emil,删除 Math.Random 等...并简单地使用cache: false
  • 我认为 jquery 为每个调用使用一个新的异步连接。
  • @Jason,你还需要什么?这里的代码加上按钮上的绑定就是我得到的全部
  • @lonesomeday,为什么要指出一些完全不相关的东西?

标签: jquery ajax


【解决方案1】:

好的,这就是我要尝试的方法,我认为您需要一种更好的方法来记录时间。我不确定你现在在做什么来测试时代,但这是一个好方法。

如果您还没有这样做,请获取适用于 Firefox 的 Firebug。

打开 Firebug 并转到 net 选项卡。确保启用它。

当您单击每个按钮时,您应该会看到每个请求。如果您单击每个按钮,则在上一个请求结束之前您不会看到下一个请求开始,那么这告诉我 javascript 有问题。但是,我猜您应该将每个小节的开头相隔 1 秒。这样做,让我们知道你看到了什么。

编辑

我想我发现你的问题了。我猜你在 php 中使用 sleep 函数。 sleep 函数为当前会话休眠。如果您打开 3 个选项卡并输入 ajax url,您会注意到相同的行为。 5、10 和 15 秒完成每个选项卡。我尝试使用谷歌搜索并与其他人发现相同的结果。这可能是因为 PHP 并不是真正的多线程。我建议使用不同的框架。

【讨论】:

  • 我使用 Firebug 来记录时间。认为这很明显,这不是菜鸟..
  • 好的,我要测试一下,让你知道
  • 我想我找到了你的问题。阅读我的编辑。它与 javascript 无关,而是在 php 中如何处理会话和睡眠!
  • 这也可以帮助php.net/manual/en/function.session-write-close.php阅读第一条评论。
【解决方案2】:

显然这种行为很容易通过使用 session_write_close();在 PHP 中。但是,这很容易为 DDos 攻击打开大门。我在 10 秒内按住 F5 刷新了一个页面,并立即杀死了我的开发人员计算机。

结案。

【讨论】:

  • Emil 我花了很多时间为您找到了解决方案。但是您写了相同的答案并认为它是正确的。您本可以将功劳归功于某些社区成员而不是您自己。
  • 完成,对不起老兄。并感谢阿米尔的帮助!对此,我真的非常感激! :)
【解决方案3】:

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

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

【讨论】:

  • 另一个线程中显示的代码是循环和循环中的ajax调用的代码,对吗?我想对每个“并排”运行而不会发生冲突的事件进行一次 ajax 调用
  • 第一个响应是一个循环,第二个例子提供了一个处理查询队列的对象,在你的情况下使用这个对象应该满足你的需要,你可能需要使用 jQuery.data 来存储以一种独立于 js 范围的方式查询队列。
  • 你还是误会了。我想做以下事情。点击按钮A,发送一个需要5秒的ajax请求。第一次单击后 1 秒,我单击按钮 B 并发送一个需要 5 秒的 ajax 请求。第二次单击后,我单击按钮 C 并发送一个需要 5 秒的 ajax 请求。这些在 A 之后 1 秒 B 和 B 之后 1 秒 C 的并行中应该很有趣。这些不是一次全部发送的。看这里:data.fuskbugg.se/dipdip/_net.png
  • 至少你有 ParallelAjaxExecuter 你的对象的基础。您需要在其上添加一些功能。他可以并行运行查询,第一点,然后你想以与你问他的顺序相同的顺序得到结果,所以这个对象也应该排队结果并在前一个完成时解锁它们(但你可能有一些相当复杂的代码来处理失败)。
  • 这里不是等待队列,是工作队列,用来给ParallelAjaxExecutor一些任务,他不会等到请求结束才取工作队列中的下一项并运行.队列用于将您的订单发送到在一个中心点处理 ajax 请求的外部对象
【解决方案4】:

并发 Ajax 请求的数量是有限制的。看到这个

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

看起来它依赖于浏览器。

鲍勃

【讨论】:

  • 如果您甚至不能同时触发两 (2) 个,则不依赖于浏览器
【解决方案5】:

你不能同时做,因为一个浏览器 UI 线程导致 JS 有虚假的异步操作。但是您可以尝试 Web Workers,这是在浏览器 UI 线程之外执行代码的方式。它们已经在 Firefox 3.5、Chrome 3 和 Safari 4 中得到支持。 也许它会提高您的应用程序可用性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多