Ожидание окончания загрузки файла
Здравствуйте. Вот у меня такая задача, пишу jQuery плагин, внутри которого есть загрузка файлов, такая последовательность действий, извлекаются все поля type=file, далее перебирается все, если есть атрибут multiple у текущего - то все что в нем отправляется по очереди и так до конца перебора всех полей. Мне необходимо заставить скрипт ждать пока закончится отправку текущего файла и перейти к след итерации перебора (each). Вот то что я написал:
var sel = $('.file'); if(sel.length>0){ console.log('Saved files, total fields: '+sel.length); function sendFile(fd){ $.element.stateUpload = true; $.ajax({ type: 'POST', url: HOST+'/uploadFile', data: fd, processData: false, contentType: false, success: function(data) { $.element.stateUpload = false; console.log(data); }, error: function(data) { $.element.stateUpload = false; console.log(data); } }); } $.each(sel,function(){ //отправка всех файлов по очереди даже если multiple - то по одному var fd = new FormData(); fd.append('elementID', data.elementID); fd.append('type',$(this).data('file')); var file = $(this)[0].files[0]; if($(this).hasAttr('multiple')){ var input = document.querySelector('[data-file="'+$(this).data('file')+'"]').files; for (var i = 0; i < input.length; i++){ fd.append('file',input[i]); sendFile(fd); } }else{ fd.append('file', file); sendFile(fd); } }); Тут еще неплохо было бы выдать alert(), после окончания загрузки всех файлов из очереди. Я лепил интервалы, ничего толкового не вышло, помогите разобраться! |
могу дать это
$.postForm = function(uri, form, onSuccess) { var formElement = $(form).get(0); var formData = new FormData(formElement); var onAjaxSuccess = onSuccess || $.noop; return $.ajax({ url: uri, type: 'POST', data: formData, cache: false, dataType: 'json', processData: false, contentType: false, success: onAjaxSuccess }); }; $('#test-form').submit(function(event) { event.preventDefault(); $.postForm('/demo/echo.php', this).success(function(data) { console.log(data); }); }); дальше сам =) |
nerv_,
а что здесь поставит в очередь запросы? |
Цитата:
|
Цитата:
собственно набодяжил решение, главное работает) if(sel.length>0){ console.log('Saved files, total fields: '+sel.length); function sendFile(fd){ $.element.stateUpload = true; $.ajax({ type: 'POST', url: HOST+'element/uploadFile', data: fd, processData: false, contentType: false, success: function(data) { $.element.stateUpload = false; console.log(data); }, error: function(data) { $.element.stateUpload = false; console.log(data); } }); } var obFD = []; $.each(sel,function(){ var fd = new FormData(); fd.append('elementID', data.elementID); fd.append('type',$(this).data('file')); var file = $(this)[0].files[0]; if($(this).hasAttr('multiple')){ var input = document.querySelector('[data-file="'+$(this).data('file')+'"]').files; for (var i = 0; i < input.length; i++){ var fd = new FormData(); fd.append('elementID', data.elementID); fd.append('type',$(this).data('file')); fd.append('file',input[i]); obFD.push(fd); } }else{ fd.append('file', file); obFD.push(fd); } }); var i = 0; var t = setInterval(function(){ if(!$.element.stateUpload){ sendFile(obFD[i]); i++; } if(i==obFD.length){ clearInterval(t); $.wnd.close(true); $.sysMsg.showOk(data.msg); return; } },1000); return; } |
Цитата:
|
Часовой пояс GMT +3, время: 09:40. |