TLDR : Как открыть файлы (потоковый текст) (желательно асинхронный, поскольку файлы могут быть большими) и отобразить их по порядку?
У меня естьстраница, которая позволяет пользователям открывать несколько файлов. Каждая строка файла читается, а затем добавляется в массив с push
в переменную display
. Массив отображения затем отображается следующим образом:
document.getElementById('content').innerHTML = <table id ="mainView">' + display.join('') + '</table>';
.
Это работает нормально, но поскольку файлы загружаются асинхронно, строки файла выталкиваются в массив не по порядку. Есть ли способ разработать механизм, который использует асинхронную загрузку файлов, но сохраняет порядок файлов? И, наконец, есть ли способ сделать это в javascript без библиотеки / фреймворка?
Порядок файлов определяется в соответствии с возрастающим соглашением о присвоении имен.
log12 <- lines in this log should appear first in the table
log16
log48
log103
Текущий вывод
log48 content
log12 content
log48 content
log103 content
Ожидаемый вывод
log12 content
log16 content
log48 content
log103 content
Вот суть того, как я загружаю несколько файлов, читаю их построчно, добавляю в массив иотобразить их на странице.
Форма загрузки файла вызывает эту функцию:
function handleFileSelect(evt) {
var files = evt.target.files;
fileArray = [].slice.call(files);
for (var i = 0; i < fileArray.length; i++) {
console.log(fileArray[i].name);
getContents(fileArray[i]);
}
}
Загрузка и отображение строк для каждого файла. Следует отметить, что display
- это глобальный массив.
function getContents(f){
if(f){
var reader = new FileReader();
reader.readAsText(f, "UTF-8");
var fileIndexname = f.name
}
reader.onload = function(evt){
var lines = evt.target.result;
// do some file splitting with regex here (removed for simplicity)
for(var i = 0; i < lines.length; i++){
display.push('<tr><td>' + lines[i] + '</td></tr>');
}
document.getElementById('content').innerHTML = '<table id ="mainView">' + display.join('') + '</table>';
}
}