Возникла проблема с чтением файлов Excel в цикле из-за не вызывания метода обещания - PullRequest
0 голосов
/ 18 января 2019

Это то, что я пытаюсь сделать, у меня есть страница на моем сайте, на которой я настроил ввод файла, и несколько кнопок, которые открывают селектор файлов и запускают определенный набор кода, показанный здесь в момент. Этот код работает, когда вам нужно только прочитать один файл за раз, проблема проявляется, как только вы начинаете читать два файла, и из-за требования клиента я должен разрешить ему принять диапазон файлов все сразу, а затем они могут быть обработаны и обработаны.

Проблема возникает из-за использования библиотеки 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, полностью пропускаются.

Я не знаю, что я делаю неправильно, я нигде не могу найти достаточно документации или помощи, чтобы решить проблему самостоятельно, и я продолжаю искать.

У кого-нибудь есть предложения о том, что я могу сделать, чтобы эта штука работала так, как должна?

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