Это то, что я пытаюсь сделать, у меня есть страница на моем сайте, на которой я настроил ввод файла, и несколько кнопок, которые открывают селектор файлов и запускают определенный набор кода, показанный здесь в момент. Этот код работает, когда вам нужно только прочитать один файл за раз, проблема проявляется, как только вы начинаете читать два файла, и из-за требования клиента я должен разрешить ему принять диапазон файлов все сразу, а затем они могут быть обработаны и обработаны.
Проблема возникает из-за использования библиотеки Excel Reader, которую я использую, и я не смог найти информацию о моих поисках в Google и SO, и даже когда я искал другие "похожие" маршруты и возможные решения, это кажется, только усугубляет проблему ...
Я должен выяснить, как заставить несколько файлов работать с этим.
Все работает до того момента, когда оно попадает в файлы xls / xlsx, функция чтения возвращает обещание, которое не разрешается до того, как скрипт переходит к следующему файлу в списке. Я пытался использовать некоторые из моих проверенных и настоящих методов, таких как функции замыкания и функции-петлители, но получаю исключения для замыканий, а циклы полностью игнорируются.
Поскольку я все еще изучаю обещания и асинхронные функции, я понятия не имею, как не знаю, заставить его ждать, пока файл не будет обработан ... или каким-то образом позволить ему вызвать fileName
переменная и i
значение для обработки.
<div class="row ml-0 w-100" id="input-file">
<div class="col-12">
<div class="form-group">
<label for="" class="control-label w-100">Select Files to Upload</label>
<input type="file" name="files" id="files" class="hidden" multiple>
<button class="btn btn-info" id="display-fs">Select Files</button>
<button class="btn btn-primary" id="do-file-work">Process Files</button>
</div>
</div>
</div>
<div class="row ml-0 w-100" id="results"></div>
<script>
// https://github.com/catamphetamine/read-excel-file
// built on node, but implemented in a standalone way
// the below is my current trouble code... It fails due to the values rows, and
// errors not being defined yet, but when i attempted the looper functions it
// just ignored the whole then completely...
var fileList = [], fileInput = $('input#files')[0], localAssetsList = [];
$('#display-fs').on('click', function () {
if ($('input#files')) {
$('input#files').click();
}
});
$(fileInput).on('change', function (event) {
fileList = [];
for (var i = 0; i < fileInput.files.length; i++) {
fileList.push(fileInput.files[i]);
}
});
$('#do-file-work').on('click', function(e){
var data = null;
if (fileList.length == 0) return;
for (var i = 0; i < fileList.length; i++) {
var file = fileList[i], extention = file.name.substring(file.name.indexOf('.') + 1, file.name.length), fileName = file.name.substring(0, file.name.indexOf('.'));
if (extention == 'xls' || extention == 'xlsx') {
debugger;
if (fileName.toLowerCase().indexOf('asset') != -1) {
readXlsxFile(file).then((function(rows, errors, fileName) {
debugger;
var data1 = rows;
if (data1.length > 0) {
$('<div></div>', {
id: 'assets-' + i,
class: 'col-12 table-responsive',
html: $('<table></table>', {
id: fileName,
class: 'table table-sm table-striped'
})
}).appendTo('#results');
$('<thead></thead>', {
html: $('<tr></tr>', {
id: fileName + '-header',
class: 'text-nowrap'
})
}).appendTo('#' + fileName);
for (var k = 0; k < data1[0].length; k++) {
var element = data1[0][k];
$('<th></th>', {
html: element.toString().toUpperCaseFirstWord()
}).appendTo('#' + fileName + '-header');
}
$('<tbody></tbody>', {
id: fileName + '-body'
}).appendTo('#' + fileName);
for (var x = 1; x < data1.length; x++) {
var ele = data1[x];
if (ele[0] === null){
console.error('Row ' + (x + 1) + ' is missing critical detail in cell 1. Skipping row.');
continue;
} else {
for (var n = 0; n < ele.length; n++) {
var y = ele[n];
if (n == 0) {
$('<tr></tr>', {
id: 'row-' + y,
html: $('<td></td>', {
html: (isNull(y)) ? "": y.toString()
}),
on: {
click: function (e) {
if ($(this).hasClass('selected-row')) {
$(this).removeClass('selected-row');
} else {
$(this).addClass('selected-row');
}
}
}
}).appendTo('#' + fileName + '-body')
} else {
$('<td></td>', {
html: (isNull(y)) ? "": y.toString()
}).appendTo('#row-' + ele[0]);
}
}
}
}
}
})(rows, errors, fileName)); //this closure doesnt work...
}
}
}
})
</script>
Это должно войти в то (...), но это не так, а затем к тому времени, когда оно (при условии, что обещание является асинхронным процессом), значения изменились бы и перестали быть действительными. это верно для загрузки одного файла, но приводит к игнорированию всей функции then (), в результате чего файлы, которые превосходят Excel, полностью пропускаются.
Я не знаю, что я делаю неправильно, я нигде не могу найти достаточно документации или помощи, чтобы решить проблему самостоятельно, и я продолжаю искать.
У кого-нибудь есть предложения о том, что я могу сделать, чтобы эта штука работала так, как должна?