【问题标题】:Prevent jQuery AJAX call from waiting for previous call to complete防止 jQuery AJAX 调用等待上一个调用完成
【发布时间】:2014-05-30 00:37:45
【问题描述】:

我已经搜索过,每个问题似乎都在询问如何等待 AJAX 调用完成。我在问如何不等待 AJAX 调用完成。

我有一个电子商务网站,它通过 PHP 进行一些繁重的图像处理。操作是通过 AJAX 调用触发的。

我试图加快用户体验,所以我修改了代码,首先让 PHP 呈现缩略图(操作很快完成),然后触发第二个 AJAX 调用,告诉 PHP 呈现完整图像(可以花几分钟)。

“加入购物车”操作也是一个 AJAX 调用。 问题是在上一个 AJAX 调用完成之前,“添加到购物车”调用无法完成。

顺序:

  1. AJAX 调用 A 请求生成缩略图。
  2. 呼叫 A 的成功回调:
    一种。显示/启用“添加到购物车按钮”
    湾。触发 AJAX 调用 B,以生成完整图像。
  3. 点击“加入购物车”会触发 AJAX 调用 C,直到调用 B 完成后才会完成。

相关的javascript:

/** Call A - make call for thumbnail generation **/
$.ajax({
    url: 'index.php?route=decorable/image/thumbnail',
    type: 'post',
    data: image_data,
    dataType: 'json',
    success: function(json) {
        if (json['success']) {
            $('#button-cart').show();
            /** Call B - make call for *full* layout generation **/
            $.ajax({
                url: 'index.php?route=decorable/image',
                type: 'post',
                data: image_data,
                dataType: 'json'
             });
    });

/** Call C - this AJAX call starts, but does not complete, until call B completes **/
$('#button-cart').click(function() {
    $.ajax({
        url: 'index.php?route=checkout/cart/add',
        type: 'post',
        data: cart_data,
        dataType: 'json',
        success: function(json) { 
            if (json['success']) {      
                $('.success').fadeIn('slow');
            }
        }
    });
});

我是不是误会了,或者即使调用 B 未完成,调用 C 也应该能够完成?

如果您认为 PHP 阻碍了体验,那么我有什么好的方法可以触发 PHP 开始执行,但仍将响应发送回缩略图 AJAX 调用?

【问题讨论】:

  • 在第一个 ajax 请求设置中设置 async:false
  • @janina 在 99.99% 的用例中,ajax 应该是异步的,我看不出它如何解决看起来像服务器端问题的 OP 问题,一次处理多个请求.编辑:好的,我知道它如何解决 OP 的问题,但他仍然不应该使用它
  • @ShawnC - 不错。实际上,我在搜索中没有找到它们,而且它们很有希望。

标签: php jquery ajax image


【解决方案1】:

根据我的经验,这是由使用了 PHP 会话引起的,当您确定在代码(所有 ajax 请求)中您不必修改会话时,您应该调用:

session_write_close()

这将允许同时发出其他请求。

延伸阅读:http://www.php.net/manual/en/function.session-write-close.php

【讨论】:

  • 你会把这段代码放在哪里?您指的是进行调用的“主”PHP页面,还是响应调用的PHP函数?
  • 我指的是响应调用的 PHP。您应该尽快将该函数放入代码中(但前提是您 100% 确定不会修改任何 $_SESSIONs
  • 太棒了。如果可以的话,我会投票更多。谢谢!
  • @cale_b 当我发现如何解决这个确切问题时,你应该已经看到了我的脸,我已经尝试了大约一年的时间:P
【解决方案2】:

大多数浏览器一次最多支持两个异步请求。你什么都做不了。

【讨论】:

  • 那么,这并不能解释这一点。发生这种情况时,只有两个请求发生。
  • @cale_b 但也许您的服务器每个用户会话只能处理一个同时请求
  • @A.Wolff - 同意。我在其他答案以及发布到该问题的 cmets 中看到了这一点。我想看看我是否可以利用session_write_close() 技术...
【解决方案3】:

请注意,如果您启用了输出缓冲(PHP 7+ 中的默认设置),则仅应用 session_write_close() [Jono20201 的答案] 可能无法解决问题。必须在 php.ini 中设置 output_buffering = Off,否则会话不会立即关闭。

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2014-07-06
    • 1970-01-01
    • 2014-07-09
    • 2018-06-09
    相关资源
    最近更新 更多