Несколько запросов ajax с jquery

У меня возникли проблемы с асинхронным характером Javascript/JQuery.

Давайте скажем следующее (задержка не подсчитывается, чтобы не сделать ее настолько трудной);

У меня есть три кнопки (A, B, C) на странице, каждая из которых добавляет элемент в корзину покупок с одним ajax-запросом. Если я помещаю преднамеренную задержку в 5 секунд на serveride script (PHP) и нажимает кнопки с 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

Это должно означать, что запросы находятся в очереди и не запускаются одновременно, правильно? Разве это не противоположность тому, что такое асинхронное? Я также попытался добавить случайный параметр get к 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, никакой разницы.

Я хочу, чтобы запросы отправлялись прямо при нажатии кнопки, а не при завершении предыдущего запроса. Я хочу, чтобы запросы выполнялись одновременно, а не в очереди.

Ответ 1

Хорошо, вот что я хотел бы попробовать, я думаю, вам нужен лучший способ занести время. Я не уверен, что вы делаете сейчас, чтобы проверить время, но здесь хороший способ.

Получите Firebug для Firefox, если вы еще этого не сделали.

Откройте Firebug и перейдите на вкладку net. Убедитесь, что вы включили его.

При нажатии каждой кнопки вы увидите каждый входящий запрос. Если вы нажмете на каждую кнопку, вы не увидите следующий запрос, начинающийся до тех пор, пока предыдущий запрос не закончится, это говорит мне, что в javascript что-то не так. Тем не менее, я предполагаю, что начало каждого бара должно быть на 1 секунду. Сделайте это и сообщите нам, что вы видите.

Edit

Думаю, я нашел тебя проблемой. Я предполагаю, что вы используете функцию сна в php. Функция сна спит для текущего сеанса. Если вы откроете 3 вкладки и поместите URL-адрес ajax, вы заметите такое же поведение. 5, 10, затем 15 с для каждой вкладки. Я попробовал поиск в Google и нашел те же результаты с другими людьми. Вероятно, это связано с тем, что PHP не многопоточен. Я предлагаю использовать другую структуру.

Ответ 2

По-видимому, это поведение очень легко проходит с помощью session_write_close(); в PHP. Однако это позволяет легко атаковать DDos. Я обновил страницу, удерживая F5 за 10 секунд и убил мой компьютер разработчиков в состоянии бездействия.

Дело закрыто.

Ответ 3

Из того, что я понимаю, параллельные вызовы ajax могут выполняться только в том случае, если вы не в разных областях js. Кажется, что находящийся в разных пределах js позволяет вам использовать один и тот же "объект запроса" сериализованным способом.

Итак, мы можем найти в Stack переполнение два отличных ответа на это на связанной странице, см. второй ответ с параллельным объектом стека запросов, это то, что вам нужно, добавить ваши запросы в этот стежок параллелепипеда, и они действительно получат (переполнение стека - лучший сайт в Интернете:-)). Параллельные асинхронные запросы Ajax с использованием jQuery

Ответ 5

вы не можете сделать это одновременно, потому что у JS есть поддельные асинхронные операции из-за одного потока пользовательского интерфейса браузера. Но вы можете попробовать Web Workers, способ выполнить аутсорсинг потока пользовательского интерфейса браузера. Они уже поддерживаются в Firefox 3.5, Chrome 3 и Safari 4. Возможно, это улучшит удобство использования вашего приложения.