innerHTML выполнить синхронно
Здравствуйте, делаю что-то вроде веб визивиг редактора с пиксельпёфектом, использую psd.js чтобы парсить psd. Проблема такая: обычный psd парсится долго, большой psd выдает ошибку вроде стэк оверфлёу, но это потом, сейчас я хочу выводить инфу о прогрессе загрузки. reader.onprogress успешно выводит проценты до 81, а потом у меня такое:
reader.onload = (e) -> info.innerHTML = "Загружено 100%" setTimeout -> *Мучительно долгий код* , 1 Просто innerHTML ничего не останавливает и выводит только после того, как последующий код выполнится. setTimeout(func, 0) ситуацию не исправил, а setTimeout(func, 1)... Тоже не исправил! Я почему-то себе думал, что подобные функции синхронны, что с этим сделать? Прим. меня: долго - это 60-80 сек |
Ещё прим.: на время парсинга вкладка намертво виснет и музыка вк в соседней вкладке самую малось подглюкивает, возможно, текст не выводится из-за этого, может есть какая-то возможность innerHTML'лу послать колбек?
|
callback?
function async(cb) { setTimeout(function(){ cb('something'); }, 2000); } async(function(response) { alert(response); }); |
Цитата:
|
То-то и оно, что странно и не путаю. Две секунды на вывод инфы тратить не хочется вовсе
|
Romaboy,
Чудес не бывает. |
Romaboy,
Вот смотри, порядок исполнения. reader.onload = (e) -> //на событие вешается коллбэк info.innerHTML = "Загружено 100%" // событие выстрелило блокировка до окончания операции setTimeout -> // операция закончена передали управление назначаем коллбек на таймаут *Мучительно долгий код* // таймаут выстрелил исполняем долгий код , 1 |
Я понял в принципе!
info.innerHTML = "Загружено 100%" - тут браузер понял, что нужно делать и дальше пошел, js отработал, а браузерная часть, которая должна DOM обновить, только получила команду от js Дальше после таймаута в 0, 1, 25, 50 мс начинает исполняться тяжелый код и браузер виснет, и та часть, которая DOM обновляет, тоже по-ходу виснет, вот и все чудеса, сделаю логику саму по-другому и будет нормально. |
Часовой пояс GMT +3, время: 14:32. |