Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   innerHTML выполнить синхронно (https://javascript.ru/forum/css-html/58465-innerhtml-vypolnit-sinkhronno.html)

Romaboy 23.09.2015 18:00

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 сек

Romaboy 23.09.2015 18:04

Ещё прим.: на время парсинга вкладка намертво виснет и музыка вк в соседней вкладке самую малось подглюкивает, возможно, текст не выводится из-за этого, может есть какая-то возможность innerHTML'лу послать колбек?

Lemme 23.09.2015 18:08

callback?
function async(cb) {
	setTimeout(function(){
    	cb('something');
    }, 2000);
}
async(function(response) {
	alert(response);
});

sortarray 23.09.2015 18:19

Цитата:

Сообщение от Romaboy
и выводит только после того, как последующий код выполнится

ты что-то путаешь. пока innerHTML=... не отработает, setTimeout не должен запустится.

Romaboy 23.09.2015 18:22

То-то и оно, что странно и не путаю. Две секунды на вывод инфы тратить не хочется вовсе

sortarray 23.09.2015 18:24

Romaboy,
Чудес не бывает.

sortarray 23.09.2015 18:29

Romaboy,
Вот смотри, порядок исполнения.
reader.onload = (e) -> //на событие вешается коллбэк
     info.innerHTML = "Загружено 100%" // событие выстрелило блокировка до окончания операции
     setTimeout -> //  операция закончена передали управление назначаем коллбек на таймаут
          *Мучительно долгий код* // таймаут выстрелил исполняем долгий код
     , 1

Romaboy 23.09.2015 18:57

Я понял в принципе!
info.innerHTML = "Загружено 100%" - тут браузер понял, что нужно делать и дальше пошел, js отработал, а браузерная часть, которая должна DOM обновить, только получила команду от js
Дальше после таймаута в 0, 1, 25, 50 мс начинает исполняться тяжелый код и браузер виснет, и та часть, которая DOM обновляет, тоже по-ходу виснет, вот и все чудеса, сделаю логику саму по-другому и будет нормально.


Часовой пояс GMT +3, время: 14:32.