Richard Deeming
(Я предполагаю, что вы делаете это на клиенте, а не на сервере. В противном случае см. Решение № 1.)
Javascript-это однопоточный язык. Если вы внесете изменения в DOM, они не будут видны до тех пор, пока ваш код не завершится и не вернет управление браузеру.
В зависимости от какие браузеры вам нужно поддерживать[^], вы могли бы переписать свой код, чтобы использовать веб-работников: Web Workers API-веб-API | MDN[^]
Это подтолкнет работу к фоновому потоку, но ваш код больше не сможет обновлять DOM. Вместо этого ему нужно было бы отправить сообщение в основной поток. Тогда вы бы справились с onmessage
событие для чтения строки данных и обновления DOM.
Я считаю, что именно такой подход используется PDF.js[^], который является движком рендеринга PDF, используемым Firefox.
В качестве альтернативы вам нужно будет переписать свой код так, чтобы вы могли выполнить одну часть работы, а затем подписать остальную часть работы в качестве продолжения и передать ее setTimeout
:
(function(){
var index = 0;
var doNextChunk = function(){
document.getElementById("status").innerText = index;
index++;
if (index < 1000) {
setTimeout(doNextChunk, 0);
}
};
doNextChunk();
})();
То
setTimeout(..., 0)
вызов вернет управление браузеру на достаточно долгое время, чтобы показать обновления DOM, а затем обратный вызов будет запущен немедленно.
Но, как уже упоминалось в комментариях, мы не можем помочь вам исправить код, который мы не видим. Если вам нужна более конкретная помощь, вам нужно будет поделиться с нами соответствующими частями вашего кода.