Индикация загрузки во время выполнения функции
Не могу нормально сформулировать запрос в гугле и найти конкретную информацию.
У меня есть функция, которая может выполнятся около 30 секунд, нужно сделать что-то на подобии анимированной индикации во время выполнения функции. Как я представляю реализацию: function my(){ document.getElementById('something').hidden = false; //Тело функции document.getElementById('something').hidden = true; } А скрывать и показывать что-то вроде этого. ![]() Но боюсь, что здесь будет непорядок с потоками и асинхронностью. Подскажите, как правильно сделать. А то чувствую, что это велосипед. |
KiZZek,
Если функция асинхронная то используйте промисы: var togglePreloader = function () { alert('Спрятали/показали прелоадер'); } var longFunction = function () { togglePreloader(); return new Promise(function (resolve) { // Тело функции setTimeout(resolve, 2000); // Вместо таймаута вызывайте resolve в конце рассчетов/запросов и т.д. }); }; longFunction().then(function () { alert('Расчет закончен'); togglePreloader(); }); |
а я в подобных случаях делаю функцию с самовызовом через нулевой таймаут.
setTimeout(function(){}, 0) выполнит указанную функцию сразу по окончании текущей функции. При этом происходит разрыв цепочки выполнения и интерфейс может обновиться. Во-вторых, это позволяет избежать проблем с уведомлением о зависшей функции, особенно в IE с его "гениальным" способом определения зависа. В-третьих, этот способ будет поддерживаться бОльшим количеством браузеров. Если же функция использует какой-либо циклический код, а является так сказать набором последовательных команд, ее можно разбить на несколько частей и вызывать эти части друг за другом. Из минусов - более громоздкий код. |
Часовой пояс GMT +3, время: 22:18. |