В настоящее время я работаю над электронным проектом, и в части проекта я хочу рекурсивно найти файлы в каталоге и показать пользователю имя каждого файла, как это делает winrar.
Вы все знаете, как работает winrar, когда мы что-то архивируем или разархивируем, имена файлов отображаются быстро, а индикатор выполнения движется вперед. Это очень похоже на то, что я пытаюсь сделать. См. изображение ниже.
Теперь проблема в том, что при рекурсивном сканировании каталога электроном он находит файлы один за другим, а затем печатает имя файла в консоли, но не в DOM. Эта ситуация заставляет пользователя думать, что программа не работает, если сканирование занимает много времени. В конце программы сканирования показать пользователю последнее имя файла после завершения всех операций сканирования.
По этой причине я написал пример кода для быстрого обновления DOM в браузере. У меня возникла та же проблема, с которой я столкнулся в своем электронном проекте. Как мне побороть эту проблему, я никогда не видел ничего подобного и почему это происходит, объясните.
Пример кода здесь. Увеличьте число до 10000 и попробуйте в браузере для лучшего понимания.
var myBtn = document.getElementById('myBtn');
var myDiv = document.getElementById('myDiv');
myBtn.addEventListener('click', function() {
for (var i = 0; i < 1000; i++) {
myDiv.innerHTML = i;
console.log(i);
}
});
#myDiv {
border: 1px solid black;
padding: 30px;
margin-bottom: 10px;
}
#myBtn {
padding: 10px;
}
<div id="myDiv"></div>
<button id="myBtn" type="button" name="button">Button</button>
Javascript является однопоточным. Если он занят циклическим просмотром вашего кода, он не может обновить представление, отображаемое пользователю. Чтобы имитировать этот эффект, вам понадобится какая-то временная петля.
Вы имеете в виду что-то вроде функции setTimeout? потому что это сделает мою программу очень медленной. Я пробовал это раньше, но каждый компьютер ведет себя по-разному, потому что скорость чтения меняется от компьютера к компьютеру, и я не могу указать постоянное время.
requestAnimationFrame
может работать, но даже при 60 кадрах в секунду показ 1000 элементов займет 16,67 секунды.