并行调用$ .when,$ .ajax()不起作用

时间:2016-10-07 22:49:06

标签: javascript php jquery ajax

我试图使用jQuery方法$ .when

进行并行调用
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <title>Sample Title</title>
</head>
<body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"> </script>
    <script>
        $.when(
            // Get the first call
            $.ajax("delay_test.php"),

            // Get the second call
            $.ajax("delay_test.php")
        ).then(function(first,second) {
            $("body").append("Done: "+first[0]+"<br>Done: "+second[0]);
        });
    </script>
</body>
</html>

我还制作了一个用于测试的PHP代码,看看它是否真的避免在第一个调用完成后进行第二次调用。

<?php
    sleep(5);
    echo date("H:i:s");
?>

但我收到的是5秒的差异:

Done: 15:27:55
Done: 15:28:00

我做错了什么或误解了吗?

1 个答案:

答案 0 :(得分:0)

首先,假设您可以使用cache:false解决您的AJAX请求来解决您的问题:

$.when(
  // Get the first call
  $.ajax({url:"delay.php",cache:false}),
  // Get the second call
  $.ajax({url:"delay.php",cache:false})
).then(function(first,second) {
  $("body").append("Done: "+first[0]+"<br>Done: "+second[0]);
});

现在让我说,我不太清楚为什么。有关chrome等待第一个AJAX请求发送第二个结果的事情;或许等着看它是否应该从缓存中提取结果。也许有人对Chrome更开明的人可以说出原因。我在IE 11中没有问题,我没有测试FireFox,Safari,Opera等。

或者,如果您不想使用对象并定义urlcachecache:false选项,则可以将GET变量附加到URL的末尾URL的时间戳,使其唯一)。类似的东西:

$.when(
  // Get the first call
  $.ajax("delay.php?r1"),
  // Get the second call
  $.ajax("delay.php?r2")
).then(function(first,second) {
  $("body").append("Done: "+first[0]+"<br>Done: "+second[0]);
});

编辑:另一种方法是在PHP脚本中设置no-cache标头。如果您使用此方法,则可能必须先清除缓存,因为您的浏览器可能已缓存它:

<德尔> header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    <删除> header("Cache-Control: post-check=0, pre-check=0", false);
    <删除> header("Pragma: no-cache");

没关系上述建议 - 在我的测试中没有用。