Ajax: Нужна помощь по поочередной загрузки файлов

#1 16 января 2015 в 02:34
Всем привет!
Собственно весь вопрос в названии темы.
Есть такой код
  1.  
  2. $("input[type=file]").change(function(event) {
  3.  
  4. $.each(event.target.files, function(index, file) {
  5. var reader = new FileReader();
  6. reader.onload = function(event) {
  7. object = {};
  8. object.filename = file.name;
  9. object.data = event.target.result;
  10. uFiles.push(object);
  11.  
  12. function upload() {
  13. $("#preview_media").append('<li class="media_block" id="progress">Загрузка...</li>');
  14. $.ajax({
  15. method: "POST",
  16. url: "/ajax/upload.php",
  17. cache: false,
  18. async: true,
  19. data: {"files": object},
  20. success: function(img){
  21. var reports = eval( '('+img+')' );
  22. $("#preview_media #progress").remove();
  23. $("#preview_media").append('Добавляем блок');
  24. }
  25. });
  26. };
  27. upload();
  28. };
  29. reader.readAsDataURL(file);
  30. });
  31.  
  32. });
  33.  
То есть я получаю все выбранные файлы из поля Input(multiple), и обхожу их each
Во время каждой итерации выпоняю ajax запрос на загрузку файла на сервер.

Как сделать так, чтобы следующая итерация НЕ выполнялась, до тех пор пока не будет получен ответ от сервера в success? То есть пока файл не загрузиться?
#2 16 января 2015 в 04:26
на скорую руку:
  1.  
  2. var files = ['file1','file2','file3','file4','file5'];
  3. function upload(file,callback) {
  4. setTimeout(function(){
  5. alert("Загрузка "+file+" файла завершена")
  6. callback();
  7. },1000);
  8. };
  9.  
  10.  
  11. (function iteration(x){
  12. upload(files[x],function(){
  13. x++;
  14. if (x<files.length){
  15. iteration(x);
  16. }
  17. });
  18. })(0);
  19.  
  20.  
#3 17 января 2015 в 12:35
Smith, не совсем понятно если честно как это поможет… Я еще новичок в jquery, и с каллбеками еще не разобрался. Поэтому такой вопрос:
— вы устанавливаете setTimeout на одну секунду. Но если файл будет большой, и ему нужно будет больше времени? Тогда получается что произойдет следующая загрузка файла, не дожидаясь предыдущей. Или я не прав?

И еще, у меня никак не получается вернуть из each массив значений uFiles. Перед функцией я естественно объявил переменную:
  1. var uFiles = []
Как ее достать оттуда?
#4 18 января 2015 в 17:48
Таймер это всего лишь имитация загрузки файла, замените его отправкой файла, а колбэк повесьте на окончание загрузки, что бы перейти к следующему файлу.
#5 18 января 2015 в 18:03

И еще, у меня никак не получается вернуть из each массив значений uFiles. Перед функцией я естественно объявил переменную:

Rossoman
Не видя кода сложно сказать, но подозреваю проблема в области видимости.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.