отображение прогресса на панели задач с запросом ajax - PullRequest
24 голосов
/ 19 марта 2010

Я хочу показать прогресс с индикатором выполнения jquery ui, когда запускается запрос ajax и когда он заканчивается Проблема в том, что я не знаю, как установить значения для индикатора выполнения в зависимости от хода выполнения запроса AJAX. Вот код для начала:

function ajaxnews()
    {
        $('.newstabs a').click(function(e){
            var section = $(this).attr('id');
            var url = base + 'news/section/' + section;

            $.ajax({
                url : url,
                dataTye : 'html',
                start : loadNews,
                success : fillNews
            });
        });
    }



// start callback functions
   function loadNews()
   {

       $('#progressbar').fadeIn();
       $('#progressbar').progressbar({ //how shoud I set the values here});
   }

   function fillNews()
   {
    $('#progressbar').progressbar('option', 'value', ?? /* how do I find this?*/);   
    $('#progressbar').fadeOut();
   }

Ответы [ 5 ]

27 голосов
/ 19 марта 2010

Основная проблема заключается в том, что вы не знаете, сколько времени займет запрос.

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

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

Если вы можете догадаться, сколько времени это займет, вы можете использовать таймер, чтобы он постепенно увеличивался, скажем, до 90%, автоматически, а когда приходит ответ сервера, установите его на 100%. Конечно, это немного притворяется.

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

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

Извините, но индикаторы выполнения трудны ...

2 голосов
/ 12 июля 2013

Я не использую jquery, но это может помочь вам.

Это анимированный индикатор прогресса Ajax с поддельным отступлением.

я просто передаю поддельный размер, зная средний размер моих скриптов

поэтому, если мои скрипты имеют размер около 50-100 КБ, я устанавливаю поддельный размер 150 КБ.

если вычисленная длина недоступна, я использую поддельный размер.

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

просто умножением поддельного размера * 2 .., если он меньше загруженных данных.

чтобы все выглядело хорошо, я добавил также эффект перехода css3, чтобы он задерживал 700 мс.

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

Скопируйте и вставьте в HTML-файл и проверьте с помощью современного браузера, как Chrome.

замените ТВОЙ САЙТ сайтом с содержанием ajax ... или чем-то другим.

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Ajax Progress</title>
<style>
#progress{
 width:300px;
 height:20px;
 border:1px solid rgba(0,0,0,0.5);
}
#bar{
 width:0%;
 height:20px;
 background-color:green;
 -webkit-transition:width 700ms ease;   
}
</style>
<script>
var
pb,
fakeSize=100000,//~100kb
progress=function(e){
 fakeSize=(e.loaded>fakeSize?(fakeSize*2):fakeSize);//Bonus
 var tot=(e.lengthComputable?e.total:fakeSize);
 pb.style.width=(100/tot*e.loaded)+'%';
},
onloaded=function(e){
 pb.style.width='100%';
},
ajax=function(a,c){
 c=new XMLHttpRequest;
 c.open('GET',a);
 c.onprogress=progress;
 c.onload=onloaded;
 c.send()
};
window.onload=function(){
 pb=document.getElementById('bar');
 ajax('YOURSITE');
}
</script>
</head>
<body>
<div id="progress"><div id="bar"></div></div>
</body>
</html>

вам просто нужно использовать функцию прогресса в jquery, а затем установить бар на 100%, когда скрипт загрузится.

2 голосов
/ 07 июля 2013

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

Мы разбили его на мелкие кусочки.

  1. Создать поток кода на стороне сервера для запуска определенного процесса. Для ASP.Net это было так:

    System.Threading.ThreadPool.QueueUserWorkItem(AddressOf MyProcessRoutine, objectParameter)

  2. В этом " MyProcessRoutine " запустите ваш долгосрочный код и обновите статическую переменную для счетчика или сохраните ее в базе данных для каждого шага, который вы хотите отслеживать.

  3. Создать другую подпрограмму функции, которая продолжает проверять этот счетчик и возвращает текущее значение. Например: Public Shared Function CheckStatus() As Integer

  4. Из вашего клиентского кода продолжайте опрашивать эту процедуру, скажем, каждые 5 секунд (в зависимости от того, какой сетевой трафик вы можете себе позволить и какую точность вы хотите. Например: timer = setInterval("MyWebService.CheckStatus();", 500);

  5. В коде на стороне клиента используйте это возвращаемое значение (счетчик) для обновления индикатора выполнения.

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

Убедитесь, что вы обрабатываете нить очень осторожно, обрабатываете все возможные исключения и правильно очищаетесь.

1 голос
/ 10 августа 2016

Это должно быть возможно с событиями на стороне сервера

1 голос
/ 07 июля 2013

Редактировать: Для потомков я оставил свой предыдущий ответ ниже, но, видя, что он на самом деле не отвечает на заданный вопрос, я даю новый ответ.

В некоторых комментариях по этому вопросу были указаны новые методы достижения этой цели. Благодаря HTML5 и более новому XHR2 можно создавать обратные вызовы для выполнения запросов AJAX. Это включает в себя добавление прослушивателей событий в объект XHR и предоставление обратных вызовов для соответствующих свойств. На этой странице есть хорошие примеры как для загрузки, так и для загрузки, а это git-репозиторий выглядит хорошо и недавно было обновлено.

Кроме того, если вы действительно заинтересованы в изучении XHR и переопределений, этот пост Mozilla doc также должен помочь. И на самом деле, этот пост с документами, похоже, основан на том git-репо, о котором я упоминал.

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

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

Разделение файла таким образом также позволяет эффективно «приостанавливать» или «возобновлять» загрузку, поскольку вы можете загружать различные части файла в любой момент времени.

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