Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.09.2015, 18:00
Аспирант
Отправить личное сообщение для Romaboy Посмотреть профиль Найти все сообщения от Romaboy
 
Регистрация: 29.05.2013
Сообщений: 61

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 сек
Ответить с цитированием
  #2 (permalink)  
Старый 23.09.2015, 18:04
Аспирант
Отправить личное сообщение для Romaboy Посмотреть профиль Найти все сообщения от Romaboy
 
Регистрация: 29.05.2013
Сообщений: 61

Ещё прим.: на время парсинга вкладка намертво виснет и музыка вк в соседней вкладке самую малось подглюкивает, возможно, текст не выводится из-за этого, может есть какая-то возможность innerHTML'лу послать колбек?
Ответить с цитированием
  #3 (permalink)  
Старый 23.09.2015, 18:08
Аватар для Lemme
Профессор
Отправить личное сообщение для Lemme Посмотреть профиль Найти все сообщения от Lemme
 
Регистрация: 15.07.2015
Сообщений: 511

callback?
function async(cb) {
	setTimeout(function(){
    	cb('something');
    }, 2000);
}
async(function(response) {
	alert(response);
});
Ответить с цитированием
  #4 (permalink)  
Старый 23.09.2015, 18:19
Кандидат Javascript-наук
Отправить личное сообщение для sortarray Посмотреть профиль Найти все сообщения от sortarray
 
Регистрация: 19.09.2015
Сообщений: 117

Сообщение от Romaboy
и выводит только после того, как последующий код выполнится
ты что-то путаешь. пока innerHTML=... не отработает, setTimeout не должен запустится.
Ответить с цитированием
  #5 (permalink)  
Старый 23.09.2015, 18:22
Аспирант
Отправить личное сообщение для Romaboy Посмотреть профиль Найти все сообщения от Romaboy
 
Регистрация: 29.05.2013
Сообщений: 61

То-то и оно, что странно и не путаю. Две секунды на вывод инфы тратить не хочется вовсе
Ответить с цитированием
  #6 (permalink)  
Старый 23.09.2015, 18:24
Кандидат Javascript-наук
Отправить личное сообщение для sortarray Посмотреть профиль Найти все сообщения от sortarray
 
Регистрация: 19.09.2015
Сообщений: 117

Romaboy,
Чудес не бывает.
Ответить с цитированием
  #7 (permalink)  
Старый 23.09.2015, 18:29
Кандидат Javascript-наук
Отправить личное сообщение для sortarray Посмотреть профиль Найти все сообщения от sortarray
 
Регистрация: 19.09.2015
Сообщений: 117

Romaboy,
Вот смотри, порядок исполнения.
reader.onload = (e) -> //на событие вешается коллбэк
     info.innerHTML = "Загружено 100%" // событие выстрелило блокировка до окончания операции
     setTimeout -> //  операция закончена передали управление назначаем коллбек на таймаут
          *Мучительно долгий код* // таймаут выстрелил исполняем долгий код
     , 1
Ответить с цитированием
  #8 (permalink)  
Старый 23.09.2015, 18:57
Аспирант
Отправить личное сообщение для Romaboy Посмотреть профиль Найти все сообщения от Romaboy
 
Регистрация: 29.05.2013
Сообщений: 61

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выдаёт ошибку при использовании innerHTML doox911 Общие вопросы Javascript 4 17.01.2014 12:01
innerHTML....? Hapson Элементы интерфейса 4 24.07.2013 01:33
Выполнить PHP-Code madssme jQuery 2 30.06.2012 18:15
Выполнить функцию заранее неизвестную Neokortex jQuery 2 13.02.2012 12:41
ошибка с innerHTML Gekt0r Общие вопросы Javascript 15 21.08.2008 11:57