несколько запросов AJAX с JQuery - PullRequest
10 голосов
/ 13 января 2011

У меня проблемы с асинхронной природой Javascript / JQuery.

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

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

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

Ответы [ 5 ]

8 голосов
/ 13 января 2011

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

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

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

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

Редактировать

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

3 голосов
/ 13 января 2011

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

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

0 голосов
/ 13 января 2011

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

0 голосов
/ 13 января 2011

Существует ограничение на количество одновременных запросов Ajax.Посмотреть это

Сколько одновременных запросов AJAX (XmlHttpRequest) разрешено в популярных браузерах?

Похоже, это зависит от браузера.

Боб

0 голосов
/ 13 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...