2016-10-07 2 views
1

я пытался сделать параллельные вызовы с помощью метода 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 

Есть ли что-то я делаю неправильно или недоразумение?

+0

Трудно интерпретировать то, что вы говорите, что получаете. Можете ли вы предоставить то, что вы на самом деле видите? И каковы ваши ожидания. Оба запроса будут сделаны немедленно и будут выполняться отдельные экземпляры сценария php. – charlietfl

+0

Просмотрите вкладку сети отладчика Chrome и посмотрите, что фактически отправляет браузер и что сервер фактически возвращает. Вам нужно выяснить, является ли это проблемой сервера или проблемой клиента. Кроме того, следите за кешированием браузера, так как вы отправляете тот же самый запрос. И какая версия jQuery вы используете? '.then()' и '.done()' будут иметь несколько другое поведение в jQuery 3.x, потому что '.then()' меняется, чтобы быть стандартным поведением ES6, которое jQuery не выполнялось в jQuery 1.x и 2.x. – jfriend00

+0

Какие точные результаты вы видите? Пожалуйста, покажите нам, что вы получаете. – jfriend00

ответ

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]); 
}); 

Теперь позвольте мне расширить, говоря, я не совсем уверен, почему. Что-то о хроме, ожидающем результата первого запроса AJAX для отправки второго; возможно, ожидая увидеть, должен ли он извлечь результат из кеша. Возможно, кто-то более просвещенный Chrome мог бы сказать, почему. У меня не было проблемы в IE 11, и я не тестировал FireFox, Safari, Opera и т. Д.

В качестве альтернативы вы можете добавить переменную GET в конец URL-адреса, если вы не хотите использовать объект и определить url и cache (опция cache:false просто добавляет временную метку к 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]); 
}); 

Edit: Еще одна альтернатива не установить не-кэша заголовков в вашем PHP скрипт. Если вы используете этот метод, вы, вероятно, придется очистить кэш первого, так как ваш браузер, вероятно, кэшируется это уже:

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");

Nevermind выше предложение - не работало в моем тестировании.

+0

Спасибо, я тоже проверил. Он работает с первыми двумя вариантами. – jjaappoo

Смежные вопросы