Показ, в ExtJs, прогресса длительной операции

194
25 декабря 2018, 17:10

Волею судьбы пришлось стать фронтендщиком и разобраться с ExtJs. Есть длительная процедура на php, которая вызывается из javascript. Необходимо выводить прогресс работы данной процедуры. Как сделал я:

  1. Есть ExtJs-форма, на которой есть элементы управления, один из которыз является кнопкой, запускающей долгоиграющую процедуру.

  2. При создании формы создаётся Task:

    var task = { run: CheckTask, interval: 200 };

  3. При нажатии на кнопку запускается процедура, внутри которой, в цикле длительной операции, есть код:

    file_put_contents($fileName, json_encode([ 'StateNumber' => $currentNumber, 'Total' => $total, 'StateText' => $text]));

  4. Так же по кнопке запускается Task, который выполняет такую функцию:

    function CheckTask() {
      Ext.Ajax.request({
        url: "checkprogress.php",
        params: { action: "Task" },
        method: "POST",
        timeout: 5000,
        success: function (result, request) {
          try {
            var jobj = Ext.util.JSON.decode(result.responseText);
            var stateText = jobj.StateText;
            var stateNumber = jobj.StateNumber;
            var total = jobj.Total;
            pb = Ext.getCmp('pb');
            pb.updateProgress(stateNumber / total, stateText);
          }
          catch (e) {
            console.log('Ошибка ' + e.name + ":" + e.message + "\n" + e.stack);
            Ext.TaskManager.stop(task);
          }
        },
        failure: function (form, action) {
          console.log('failure');
          Ext.TaskManager.stop(task);
        }
      })
      }
  5. Соответственно checkprogress.php

        if (file_exists($fileName)) {
            $line = json_decode(file_get_contents($fileName));
            $json_answer['success'] = true;
            $json_answer['res'] = true;
            $json_answer['StateNumber'] = $line->StateNumber;
            $json_answer['Total'] = $line->Total;
            $json_answer['StateText'] = $line->StateText;
        } else {
            $json_answer['success'] = false;
            $json_answer['res'] = false;
        }
        echo json_encode($json_answer);

И вроде бы всё работает, но напрягает большое количество запросов, посылаемой для проверки прогресса. Как принято делать подобные вещи? Какие временные параметры для запросов стоит задавать?

Есть ещё вариант, но пока не реализованный: В проверяющей задаче, при отправке запроса выставить огромный таймаут, а на стороне сервера в цикле проверять статус задачи. Если статус не изменился, то продолжаем цикл и ничего не возвращаем. Если изменился или пришёл статус, например 'break', то, соответственно или возвращаем результат и снова делаем запрос или возвращаем результат и прекращаем проверки.

Короче, хотелсь бы best practices для подобных задач.

Спасибо.

READ ALSO
PHP регистрация при выключенных куки

PHP регистрация при выключенных куки

Уважаемые специалисты помогите с вопросомНа сайте есть форма регистрации, в качестве логина указывается E-mail, после заполнения полей формы...

173
Что я делаю не так с запросами SQL в LARAVEL?

Что я делаю не так с запросами SQL в LARAVEL?

Собственно, вот моя функция контроля флуда

165