Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.01.2015, 07:13
Аватар для Sanu0074
Аспирант
Отправить личное сообщение для Sanu0074 Посмотреть профиль Найти все сообщения от Sanu0074
 
Регистрация: 16.12.2012
Сообщений: 80

Ожидание окончания загрузки файла
Здравствуйте. Вот у меня такая задача, пишу 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(), после окончания загрузки всех файлов из очереди. Я лепил интервалы, ничего толкового не вышло, помогите разобраться!
Ответить с цитированием
  #2 (permalink)  
Старый 09.01.2015, 10:55
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

могу дать это
$.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);
    });
});


дальше сам =)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #3 (permalink)  
Старый 09.01.2015, 15:19
Аватар для Sanu0074
Аспирант
Отправить личное сообщение для Sanu0074 Посмотреть профиль Найти все сообщения от Sanu0074
 
Регистрация: 16.12.2012
Сообщений: 80

nerv_,
а что здесь поставит в очередь запросы?
Ответить с цитированием
  #4 (permalink)  
Старый 09.01.2015, 20:39
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Sanu0074
поставит в очередь запросы?
А нафиг оно надо? Лучше разом отправить - быстрее будет.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 10.01.2015, 01:56
Аватар для Sanu0074
Аспирант
Отправить личное сообщение для Sanu0074 Посмотреть профиль Найти все сообщения от Sanu0074
 
Регистрация: 16.12.2012
Сообщений: 80

Сообщение от danik.js Посмотреть сообщение
А нафиг оно надо? Лучше разом отправить - быстрее будет.
такая задумка)

собственно набодяжил решение, главное работает)
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;
                }
Ответить с цитированием
  #6 (permalink)  
Старый 10.01.2015, 11:37
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Sanu0074
такая задумка)
Другими словами - навязчивая идея? Бывает. Кстати, это лечится.
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как прочитать параметры файла JPEG ещё в браузере, до загрузки на сервер? Webnode Общие вопросы Javascript 6 13.01.2014 20:44
Не понимаю JavaScript. Как сделать ожидание события загрузки данных? xintrea AJAX и COMET 7 01.06.2013 17:18
Ожидание загрузки до существования переменной nemo AJAX и COMET 1 29.01.2010 22:31
Загрузка файла AJAX'ом - почему-то переводит на страницу загрузки файла .andreev AJAX и COMET 13 21.10.2009 22:25
Поле загрузки файла kotofeich Элементы интерфейса 3 30.07.2008 11:24