@gh0sty
Веб-разработчик. Пишу под Python Django.

Как реализовать асинхронный js после цикла?

В общем я хочу сделать загрузчик нескольких фотографий. К сожалению, все плагины этого формата мне не подходят. Решил сделать самостоятельно. Но почему-то код выполняется синхронно, промисы и таймауты пробовал - 0 эффекта. Мейби проблема в change.

Задача в том - чтоб заменить место место для инпута на превью а инпут сдвинуть правее.

Я делаю так - при изменении инпута:
  1. Считываю фотку
  2. Беру контейнер родителя этого инпута
  3. Делаю append к родителю - див с превью фото
  4. Удаляю сам инпут
  5. Создаю аналогичный инпут (просто строкой)
  6. Закидываю его в родитель родителя

Це код:
var files_uploaded = 0;
$("#add-image").on("change", function(e) {
    var files = e.target.files,
    filesLength = files.length;
    files_uploaded += filesLength;
    console.log(files_uploaded);
    for (var i = 0; i < filesLength; i++) {
        var f = files[i];
        var fileReader = new FileReader();
        fileReader.onload = (function(e) {
            var file = e.target;
            var upl = $('.upload-image');
            var app = '<div class="uploaded-img"><i class="fas fa-times remove"></i><img src="' + e.target.result + '" title="' + file.name + '"/></div>';
            upl.parent().append(app);
            upl.remove();
            console.log('do');
        });
        fileReader.readAsDataURL(f);
    }
    //Тута новый инпут
    var upl ='<div class="col-12 col-md-6 col-lg-4" style="height: 150px"><label class="label d-block upload-image position-relative w-100 rounded-3 bg-gray"><span class="font-weight-bold vertical-align-middle">' + files_uploaded+1 + '</span><input type="file" class="sr-only" id="add-image" name="image" accept="image/jpeg, image/png"></label></div>';
    $('#all-images').append(upl);
    console.log('done');
});


Консоль выдает: 1 done do

Получается вот так c одной загрузки:
5dbafa92ce02d631151893.png

DOM:
5dbafc975fb7b559994425.png

Но почему-то второй блок заменяется повторным изображением. В этом и есть проблема. Мне кажется, косячит где-то алгоритм, а не синхронность. Я пробовал async + then - все тоже. Но если у вас есть вариант - пишите, чекну быстро.
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
@gh0sty Автор вопроса
Веб-разработчик. Пишу под Python Django.
Спасибо, Алексей Ярков !
Проблема скорее всего была в пересоздании инпута и повторном вызове change.
Т.к. не удавалось сделать промис - сначала создавался новый input, а потом повторно заменялся превьюхой.
(просто тупил XD)
Сделал через before.
Це код:

var files_uploaded = 0;
$("#add-image").on("change", function(e) {
    var files = e.target.files,
    filesLength = files.length;
    for (var i = 0; i < filesLength; i++) {
        var f = files[i];
        var fileReader = new FileReader();
        fileReader.onload = (function(e) {
            var file = e.target;
            var upl = $('#all-images .upload-image').parent(); //col с загрузчиком (все объекты в col обернуты)
            upl.css('display', 'none');
            files_uploaded += 1;
            var new_img = '<div class="col-12 col-md-6 col-lg-4 mb-3" style="height: 150px; display: none"><div class="uploaded-img"><span class="image-number customized customized-border-color">' + files_uploaded + '</span><i class="fas fa-times remove-image customized-color-h"></i><img src="' + file.result + '"/></div></div>';
            upl.before(new_img); //вставить перед загрузчиком
            $('#all-images .upload-image span').text(files_uploaded+1); //меняем циферку
            upl.prev().fadeIn(); //для красоты
            upl.fadeIn();
        });
        fileReader.readAsDataURL(f);
    }
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zkrvndm
@zkrvndm
Архитектор решений
Я бы переписал все это на чистом ванильном JS, так как в нем можно быть уверенным, что команды внутри функции будут выполнены последовательно, а вот с jQuery не факт.
Ответ написан
Ваш ответ на вопрос

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

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