nastya97core
@nastya97core
Начинающий программист

Почему progress срабатывает лишь перед получением результата?

Здравствуйте. Есть вот такой код:
function send(event, php){
console.log("Отправка запроса");
event.preventDefault ? event.preventDefault() : event.returnValue = false;
var req = new XMLHttpRequest();
req.open('POST', php, true);
req.onload = function() {
	if (req.status >= 200 && req.status < 400) {
		json = JSON.parse(this.response);
    	console.log(json);

    	// ЗДЕСЬ УКАЗЫВАЕМ ДЕЙСТВИЯ В СЛУЧАЕ УСПЕХА ИЛИ НЕУДАЧИ
    	if (json.result == "success") {
    		// Если сообщение отправлено
    		alert("Сообщение отправлено");
    	} else {
    		// Если произошла ошибка
    		alert("Ошибка. Сообщение не отправлено");
    	}

} else {alert("Ошибка сервера. Номер: "+req.status);}}; 

req.onerror = function() {alert("Ошибка отправки запроса");};
req.send(new FormData(event.target));
}


Мне нужно подкрутить к этой функции прогресс загрузки. Я дописала эти строки:
req.onprogress = function(event) {
    console.log(event);
  }


Но почему-то этот прогресс срабатывает лишь перед самим получением результата. Сложно объяснить, но грубо говоря:
жмёшь >
ждёшь секунд 5 >
потом за одну секунду в console записывается десяток (в зависимости от размера файла) строк >
и потом сразу срабатывает alert.

Вообще я предполагала, что это должно происходить по мере загрузки, а не в один момент, в виде полного отчёта. Может быть я допустила какую-то ошибку?
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
Вы хотите какой прогресс считать, загрузки файла или получения результата?
Если первое, то нужно получать объект XMLHttpRequestUpload и на него вешать обработчки
https://developer.mozilla.org/en-US/docs/Web/API/X...
Если второе, то все происходит правильно https://developer.mozilla.org/en-US/docs/Web/API/X...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@FODD
Потому-что XMLHttpRequest вызывает событие progress только при загрузке или скачивании. Вы запрашиваете ресурс, который отдаёт заголовки долго, но при этом имеет малый размер и скачивается моментально, потому событие успевает сработать только один раз.

Можете попробовать через devtools ограничить скорость скачивания до очень маленьких величин и увидеть, как событие progress срабатывает несколько раз после того, как сервер отдал вам заголовки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы