jQuery: Используя один Ajax-вызов, получать прогрессивные статусы вместо одного? - PullRequest
3 голосов
/ 18 января 2010

Мне просто интересно ... возможно ли получить несколько ответов от одного вызова ajax? Я думаю исключительно для эстетических целей обновить статус на стороне клиента.

У меня есть один метод ajax, который вызывается при отправке формы

$.ajax({
  url: 'ajax-process.php',
  data: data,
  dataType: 'json',
  type: 'post',
  success: function (j) {
  }
});

Я могу получить только один ответ со стороны сервера. Можно ли получить прерывистые статусы? Такие как:

По умолчанию (первое): создание аккаунта Далее: отправка подтверждения по электронной почте Далее: Готово

Спасибо за вашу помощь! :)

Ответы [ 3 ]

2 голосов
/ 18 января 2010

От одного вызова ajax я не думаю, что это возможно.

То, что вы могли бы сделать, это часто проверять, где находится процесс (например, это то, что используется для полос загрузки в gmail).Вы делаете первый запрос AJAX для запуска процесса, а затем серию запросов AJAX, чтобы спросить сервер, как у него дела.Когда сервер отвечает «Я закончил», все готово, и до этого вы можете заставить сервер отвечать и говорить текущее состояние.

0 голосов
/ 18 января 2010

Возможно, но это больше связано с вашим внутренним скриптом.Как упомянул Энтони, есть технология под названием комета.Другой термин, который я слышал, называется «Длинный опрос».Идея состоит в том, что вы задерживаете время, за которое ваш php (вставьте язык по выбору) сценарий завершил обработку.В php вы можете сделать что-то вроде этого: </p> <pre> while($response !== 'I'm done'){ sleep(1); }else{ return $some_value; exit(); } </pre> <p>

Этот код не дает вашему скрипту полностью завершиться.Функция sleep (1) позволяет сценарию остановиться и позволяет серверу отдыхать в течение 1 миллисекунды, прежде чем он возвращается к циклу.Вы можете настроить время сна в зависимости от ваших потребностей.В php время, в течение которого скрипт спит, не учитывается в зависимости от времени ожидания вашего сервера.

Вам, очевидно, нужно будет сделать больше проверок для своего кода.Возможно, вы также захотите разрешить вызов сценария прерывания.Что-то вроде отправки запроса get, чтобы убить серверный скрипт.Возможно на событии выгрузки JavaScript.

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

0 голосов
/ 18 января 2010

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

Вы можетеоткрыть постоянный поток с сервера, чтобы он продолжал выводить данные, однако я не уверен, как сценарий на стороне клиента может обрабатывать их как отдельные «сообщения».Думайте об этом как о сервере, который выводит некоторую информацию в браузер, выполняет больше работы, выводит еще больше в браузер, выполняет больше работы и т. Д. Это отображается более или менее в реальном времени для браузера в виде печатного текста.Это один длинный ответ, но это все еще один ответ.Я думаю, что ajax обрабатывает ответ только после того, как он закончил отправку, но, возможно, кто-то еще узнает больше, чем я, по этой теме.

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

Лучше всего делать сустойчивый поток, но опять же, я не уверен, как ajax обрабатывает получение ответов в чанках.

Быстрое обновление

Основано на примечаниях для этого плагина:

[http://plugins.jquery.com/project/ajax-http-stream]

вещи не выглядят многообещающими.В частности:

Очевидно, что тенденция состоит в том, чтобы запретить доступ к xmlhttprequest.responseText до завершения запроса (глупо, imo).Извините, я ничего не могу сделать, чтобы исправить это

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

Другой вариант - ваш сценарий записывает свое состояние в определенных точках в другой файлсервер, назовите его «status.xml» или «status.txt».Пусть ваша первая функция ajax инициализирует процесс, а вторая функция ajax запрашивает этот файл состояния и выводит его пользователю.

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