Есть ли события обновления прогресса в jQuery ajax?

у меня есть длительная задача, которую называют с помощью jQuery ajax., я использую блок ui плагин для показа "загрузки". есть ли так или иначе, я могу передать сообщения о ходе выполнения обратно клиенту, чтобы показать прогресс и обновить это на блоке ui сменное сообщение.

Таким образом, это покажет это (поскольку сервер делает свою работу)..

"Загрузка первого источника..".
"Загрузка второго источника..".
"Загрузка третьего источника..".
"Парсинг Результатов..".

9
задан leora 30 June 2011 в 02:03
поделиться

5 ответов

Из того, что я видел для случая загрузки материала - люди создают отдельный шлюз и запрашивают у него информацию о ходе выполнения, поскольку она доступна только на стороне сервера. Но я думаю, что это не лучшее решение в вашем случае.

Если вы хотите загружать материал с информацией о ходе выполнения или позволить серверу выводить информацию о ходе выполнения при генерации вывода, то http streaming - это то, что вам нужно. Это хорошо описано здесь. По сути, это один http-запрос, на который сервер отвечает частями в течение минуты или около того (поэтому отправляет материал, когда захочет), а затем открывается новое соединение.

Для меня это было большим открытием ;)

[edit]

В настоящее время существует множество лучших техник, и все они завернуты в Socket.IO - Websockets с отступлением к другим техникам, включая http streaming

Socket.IO - это модуль для nodeJS, но есть и другие, похожие реализации. Я уже обменялся несколькими пакетами с реализацией JAVA Socket.IO из https://github.com/Atmosphere/atmosphere

11
ответ дан 4 December 2019 в 12:17
поделиться

Я только недавно узнал о проекте, который выполняет «push» ajax. Вы можете проверить это:

http://www.ape-project.org/

Насколько я знаю, есть еще несколько других проектов, делающих подобные вещи, это вернее всего: " отправлять сообщения о ходе выполнения обратно клиенту », где другое решение требует запроса на опрос о ходе выполнения (все еще очень законное и хорошее решение).

1
ответ дан 4 December 2019 в 12:17
поделиться

Я бы хотел, чтобы каждый запрос AJAX возвращал ответ JSON, содержащий сообщение, данные и следующий URL-адрес для запроса: {сообщение: «Загрузка второго ресурса ...», data: ..., next_url: «/ next_part»}

Перед первым запросом AJAX установите для сообщения BlockUI значение «Загрузка ...». Когда вы получите ответ, установите для сообщения BlockUI сообщение, которое вы получили после вызова AJAX. Затем сделайте следующий вызов AJAX для значения «next_url» и так далее, повторяя цикл до тех пор, пока вы не выполните все задачи.

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

1
ответ дан 4 December 2019 в 12:17
поделиться

Один из способов - использовать обработчики HTTP и AJAX с jQuery.

1. Инициировать запрос на стороне сервера

$("#btnCreateInvoice").click(function() {             
       $.ajax({ type: "POST",  url: "YourHttpHandler.ashx",
       contentType: "text/html; charset=utf-8",
       dataType: "html",  
       success: function(data) { start the block UI }
       });
    });

2. Опрос

Что дальше вам нужно сделать, так это опросить сервер с интервалом 't' и получить статус. Для этого нам нужно вызвать функцию с интервалом «t», которая инициирует AJAX-вызов HTTPHandler для получения статуса.

$(function() {
  setInterval(updateStatus, 't');
});

function updateStatus() {
  $.ajax({ type: "POST",  url: "GetStatusHandler.ashx",
       contentType: "text/html; charset=utf-8",
       dataType: "html",  
       success: function(data) { process 'data' here and update the block UI message box }
       });
}

В вашем случае GetStatusHandler.ashx может возвращать полный innerHtml для статуса. Например, при первом вызове он вернет «Загрузка первого источника ...», затем он может вернуть:
Кодирование Первый источник ...
Загрузка второго источника ...
и так далее.

4
ответ дан 4 December 2019 в 12:17
поделиться

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

Я предлагаю разделить обработку на один клиентский запрос для каждого источника данных:

function loadData() {
   // Each call passes callback(id) as a success handler
   fireAsynchronousRequest("source1");
   fireAsynchronousRequest("source2");
   fireAsynchronousRequest("source3");
}

function callback(var source) {
   if (source == "source1") {
       updateStatus("Source 1 loaded");
   }
   else if (source == "source2") {
       updateStatus("Source 2 loaded");
   }
}

Это пример асинхронного решения. Вы можете реализовать обработку состояния в callback () , если вам нужно, чтобы это было синхронно.

0
ответ дан 4 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: