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

Я хочу создать раздел на моем сайте, где у пользователя есть несколько простых кнопок update .

Каждая из этих кнопок update будет отправляться на сервер и будет продолжать хруст за сценой.

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

Я использую jQuery в качестве моей библиотеки JavaScript и CodeIgniter (PHP) в качестве серверной структуры, если это важно …

То, о чем я думал, использует функцию flush() PHP, чтобы сообщить о состоянии выполнения jQuery, но я не уверен, что функции Ajax jQuery читают результат до его завершения …

Поэтому любые советы / объяснения были бы полезны и полезны!

Я приведу вам пример использования WebSync On-Demand , но тот же подход будет работать независимо от вашего выбора сервера.

Вот что вы делаете. Во-первых, как-то начинайте работать в долгосрочной перспективе; ваш пользователь нажимает кнопку, чтобы начать этот процесс (я собираюсь принять вызов Ajax, но что-то работает), и вы возвращаете им какой-то идентификатор, мы назовем это «myId», придаем ему значение ' 1' . Независимо от того, выполняете ли вы это, ссылаясь на какой-то процесс и т. Д., Зависит от вас.

Затем, в своем обратном вызове из этого вызова, вы должны написать что-то вроде этого:

 var myId = 1; // this would be set somewhere else client.initialize('api key'); client.connect(); client.subscribe({ channel: '/tasks/' + myId, onReceive: function(args){ // update the progress bar myProgressBar.update(args.data.progress); } }); 

Что это будет, так это подписаться на ваш клиент, чтобы получать уведомление об обновлениях задачи, поэтому все, что осталось, – это выталкивать обновления, которые вы делаете в любом процессе, на самом деле выполняющем задачу. Это будет выглядеть (на PHP, используя SDK):

 $publisher = new Publisher( "11111111-1111-1111-1111-111111111111", // your api key again "mydomain.com" // your domain ); // publish data $response = $publisher->publish(array( array( 'channel' => '/tasks/' . $myId, //comes from somewhere 'data' => (object) array( 'progress' => '45' //45% complete ) ) )); // success if empty (no error) $success = empty($response); 

Это оно; по мере обновления, они будут выходить на ваш клиент в режиме реального времени.

Это довольно сложно. То, что мы установили для нашей системы, – это «фальшивый» индикатор прогресса – он просто оживляет много раз (что, поскольку это оживленный gif, вы можете ожидать!).

Альтернативой было бы представить один сценарий и обработать его в фоновом режиме (и вывести прогресс в файл), сделав запрос Ajax другому сценарию, единственная обязанность которого заключается в том, чтобы прочитать этот файл прогресса и вернуть, насколько далеко вы пройдете процесс находятся. Это сработало бы – он чувствует себя немного глупым, но это, по крайней мере, решит вашу непосредственную проблему.

Я очень мало знаю о кометах или подобных, так что это чисто основано на моем нынешнем понимании.