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, время: 02:09. |