Многофайловый JavaScript отправляет неправильный порядок индекса (также повторяет индекс) - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь отправить несколько файлов в Dropbox, используя JavaScript и Ruby / Rails.Сначала я должен декодировать изображение с помощью кода qr и отправить его на мой сервер в Ruby, а затем отправить его в dropbox.Проблема в том, что когда я пытаюсь декодировать файл и отправить его, он идет не в том порядке.Я знаю, что это, вероятно, из-за функции загрузки читателя.Но как я могу решить это и почему это так?PS: мой код qr должен быть числом (код из базы данных), поэтому я использую 'isnum' ps2: я пробовал 10 файлов, и в моем файле console.log, где 'j' напечатано в следующем порядке:1, 7, 7, 4, 6, 6, 6, 6, 3 и 0. Как сделать так, чтобы эти индексы не повторялись?

function setupReader(file, j){
    var reader = new FileReader();
    reader.onload = function (e) {
        qrcode.decode(e.target.result);
        qrcode.callback = function(a){
            console.log("callback", j);
            var isnum = /^\d+$/.test(a);
            var form_data = new FormData();
            count_send++;

            if (isnum){
                form_data.append("code", a);
                form_data.append("file", file);
                // console.log(form_data);

                var request = new XMLHttpRequest();

                                request.open('POST', '/docs/baixaponto', /* async = */ false);
                request.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
                                request.send(form_data);

                                if (returnedStatus != 200){
                                    error_files_dropbox_baixa_filesimgs.push(e.target.result);
                                    e.target.result = "";
                                    error_files_dropbox_baixa_arquivos.push( returnedStringFinal );
                                    error_files_dropbox_baixa.push( file );
                                    error_files_dropbox_baixacount++;


                                }
                                else{
                                    success_files_filesimgs.push(e.target.result);
                                    e.target.result = "";
                                    success_files_arquivos.push( returnedStringFinal );
                                    success_files.push( file );
                                    success_filescount++;


                                }
            }
            else {
                error_files_decode_filesimgs.push(imgcoded64);
                e.target.result = "";
                error_files_decode.push( file );
                error_files_decodecount++;
            }
            if ( count_send == count ){
                 //function that opens a modal with file results
                 setTimeout(showdetalhedfiles, 2000);
            }
        };
    }
    reader.readAsDataURL(file);
}

Другая функция:

function readqrcode(){
    f = document.getElementById('myfiles');
    count = f.files.length;

    if (f.files && f.files[0]) {
        for (var i = 0; i < count; i++) {
            setupReader(f.files[i], i);
        }
    }
    else{
        alert("Nenhum arquivo selecionado");
    }
}
...