#javascript #asynchronous #dom #ecmascript-6
#javascript #асинхронный #dom #ecmascript-6
Вопрос:
Я хочу отображать счетчик загрузки, подобный этому, пока тяжелая функция блокирует основной поток.
Мой код в основном выглядит так:
image.onload = function onLoad() {
document.getElementById("loading-spinner").style.display = "block";
run_heavy_function(this);
};
Счетчик загрузки отображается только после завершения функции. Это не то, чего я хочу.
Я сталкивался с некоторыми решениями, использующими setTimeout и прочее. Но мне это не кажется хорошей идеей. Каков правильный подход к изменению DOM в фоновом процессе в ES6 с использованием чистого javascript?
Комментарии:
1. Решение состоит в том, чтобы не блокировать основной поток. Возможно, вы захотите использовать web workers для тяжелых задач, если вы можете их использовать (благодаря поддержке). developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API /…
Ответ №1:
Простой способ решить эту проблему — объединение событий:
const loaderStart = new Event('loaderStart');
const loaderEnd = new Event('loaderEnd');
const spinner = document.getElementById("loading-spinner");
image.onload = function onLoad() {
spinner.dispatchEvent(loaderStart);
run_heavy_function(this);
spinner.dispatchEvent(loaderEnd);
};
spinner.addEventListener('loaderStart', function(){
this.style.display = "block";
});
spinner.addEventListener('loaderEnd', function(){
this.style.display = "none";
});