Как отобразить прогресс серверного скрипта в jQuery?

С помощью этого кода я могу показать анимированный gif во время работы серверного скрипта:

function calculateTotals() {
    $('#results').load('getResults.php', null, showStatusFinished);
    showLoadStatus();
}

function showLoadStatus() {
    $('#status').html('');
}


function showStatusFinished() {
    $('#status').html('Finished.');
}

Однако я хотел бы отобразить статус того, насколько далеко продвинулся сценарий, например «Линия обработки 342 из 20000 ...» и дайте ей подсчитать, пока она не закончится.

Как я могу это сделать? Я могу сделать серверный скрипт, который постоянно содержит обновленную информацию, но где мне поместить команду, чтобы читать это, скажем, каждую секунду?

Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
6
0
5 013
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ваш серверный сценарий должен каким-то образом сохранять свой прогресс где-то на сервере (файл, поле в базе данных, memcached и т. д.).

У вас должна быть функция AJAX, возвращающая текущий прогресс. Опрашивайте эту функцию раз в секунду и соответствующим образом визуализируйте результат.

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

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

Хорошо, но где мне поместить строку, которая читает сценарий состояния? Вот чего я не понимаю. Я не могу сделать это в моей функции showLoadStatus (), поскольку она выполняется только один раз.

Edward Tanguay 16.09.2008 16:27

Я не разбираюсь в деталях jQuery, но общий ответ, не связанный с опросом, будет следующим: используйте вариант метода навсегда кадр. По сути, создайте скрытый iframe и установите для него src getresults.php. Внутри getresults вы выполняете обратную передачу блоков сценария, которые представляют собой вызовы функции javascrpt в родительском документе, которая фактически обновляет ход выполнения. Вот пример, который показывает основную идею фрейма навсегда. (Я бы не рекомендовал использовать его настоящий JS или HTML, он достаточно средний)

Ответ принят как подходящий

После прочтения ваших комментариев к ответу Андрея.

Вы бы прочитали статус так:

function getStatus() {
    $.getJSON("/status.php",{"session":0, "requestID":12345}, 
    function(data) { //data is the returned JSON object from the server {name:"value"}
          setStatus(data.status);
          window.setTimeout("getStatus()",intervalInMS)
    });
}

С помощью этого метода вы можете открыть несколько одновременных XHR-запросов на сервере.

весь ваш status.php для вывода:

{"status":"We are done row 1040/45983459"}

Однако вы можете вывести в ответ столько информации, сколько захотите, и обработать ее соответствующим образом (например, подать индикатор выполнения или выполнить анимацию ..)

Для получения дополнительной информации о $ .getJSON см. http://docs.jquery.com/Ajax/jQuery.getJSON.

Другие вопросы по теме