код работает во время отладки, но без - Javascript / Jquery - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть проблема, которую я не понимаю, и я понятия не имею, как ее исправить, где искать причину. Когда я debugin (chrome), все работает, но при обычном использовании - нет. Для меня это какая-то научная фантастика, для меня было бы лучше, если бы она была больше научной, чем художественной: :)

for (var i = 0; i < filteredAddedFiles.length; i++) {
  if ((/\.(png|jpeg|jpg|gif)$/i).test(filteredAddedFiles[i].name)) {

    (function (file) {
      var reader = new FileReader();
      var blob = b64toBlob(file.base64.replace('data:image/jpeg;base64,', ''), file.type);
      reader.addEventListener("load", function () {

        console.log(this);
        var image = new Image();
        image.src = window.URL.createObjectURL(blob);
        image.onload = function () {
          preview.innerHTML += drawHtml(image, file)
        };

        //I tried:
        //(function (b) {
        //  var image = new Image();
        //  image.addEventListener("load", function () {
        //    preview.innerHTML += drawHtml(this, file);
        //    //window.URL.revokeObjectURL(image.src);
        //  });
        //  image.src = window.URL.createObjectURL(b);
        //})(blob);
      });
      reader.readAsDataURL(blob); 
    })(filteredAddedFiles[i]);

  } else {
    errors += filteredAddedFiles[i].name + " Unsupported Image extension\n";
  }
}

здесь я приложил небольшой фильм, который показывает, как это работает ссылка на фильм

не работает - я имею в виду - похоже, все внутри for не выполнено

РЕДАКТИРОВАТЬ: 1

@ Teemu - я включаю логи в chrome console и все console.log появляются

@Katie.Sun - теперь вышеприведенное for - console.log(filteredAddedFiles.length); равно 0 - но когда я отлаживаю код, тот же console.log(filteredAddedFiles.length); имеет значения!

РЕДАКТИРОВАТЬ: 2

@ Матти Прайс filteredAddedFiles - это результат пользовательской логики страницы, фильтрации, проверка и т. д. Здесь все начинается:

addedFiles = added(files); // files - FileList from input this is a read only array of obj

function added(from) {
            var out = [];
            for (var i = 0; i < from.length; i++) {
                (function (obj) {
                    var readerBase64 = new FileReader();
                    readerBase64.addEventListener("load", function () {
                        var fileBase64 = readerBase64.result;
                        var row = { name: obj.name, size: obj.size, type: obj.type, base64: fileBase64 }
                        out.push(row);
                    });
                    readerBase64.readAsDataURL(obj); 
                })(from[i]);
            }
            return out;
        }

затем addedFiles - сделать что-нибудь дальше и преобразовать в filteredAddedFiles позже. что я нашел в added функции? во время отладки есть length значение, которое правильно, но когда я открыл __proto__: Array(0), я обнаружил length свойство = 0.

Должно ли это значение length быть равно значению сверху length?

print screen

Второе: Я должен признать, что мне не хватает знаний о addEventListener. Есть ли здесь какие-либо очереди или какой-то поток и т. Д.?

РЕДАКТИРОВАТЬ: 3 После последнего комментария @Teemu я внес некоторые изменения (мне пришлось прочитать много обещаний и т. Д. :)), но вывод тот же console.log("out resolve", out); показывает массив объектов, но console.log("out.length then", out.length); показывает 0 и small blue i-icon показать сообщение - Value below evaluated just now

var out = [];
for (var i = 0; i < files.length; i++) {
    fillArray(files[i], out);
}
console.log("out resolve", out);
console.log("out.length then", out.length);

function fillArray(obj, out) {
    return new Promise(function (resolve, reject) {
        var readerBase64 = new FileReader();
        readerBase64.addEventListener("load", function () {
            var fileBase64 = readerBase64.result;
            var row = { name: obj.name, size: obj.size, type: obj.type, out.push(row);
            resolve(out);
        });
        readerBase64.readAsDataURL(obj); 
    });
}

После того, как я разместил редактирование выше, я изменил, что я просто создаю promise, я забыл назвать `обещание

, но это не важно, потому что 90% моего кода было изменено из-за этой темы и ответа Золотого Человека @ Kaiido

URL.createObjectURL () - синхронно. Вам не нужен адский обработчик событий Promise, все можно сделать за один цикл.

В моем случае это лучшее решение, чем программа для чтения файлов, мне нужно загружать только изображения, и с некоторыми ограничениями, благодаря которым мне не нужно беспокоиться о зависании интернет-браузера из-за природы synchronous из createObjectURL() Спасибо за вашу помощь и приверженность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...