Волею судьбы пришлось стать фронтендщиком и разобраться с ExtJs. Есть длительная процедура на php, которая вызывается из javascript. Необходимо выводить прогресс работы данной процедуры. Как сделал я:
Есть ExtJs-форма, на которой есть элементы управления, один из которыз является кнопкой, запускающей долгоиграющую процедуру.
При создании формы создаётся Task:
var task = {
run: CheckTask,
interval: 200
};
При нажатии на кнопку запускается процедура, внутри которой, в цикле длительной операции, есть код:
file_put_contents($fileName, json_encode([
'StateNumber' => $currentNumber,
'Total' => $total,
'StateText' => $text]));
Так же по кнопке запускается 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);
}
})
}
Соответственно 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 для подобных задач.
Спасибо.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Уважаемые специалисты помогите с вопросомНа сайте есть форма регистрации, в качестве логина указывается E-mail, после заполнения полей формы...