|
setTimeout/setInterval - неожиданное поведение
Всем доброго времени суток...
IE8\HTML+JS+ActiveX ; Страничка с согласия юзверя работает через объекты ActiveX c MS Excel и файловой системой, а пока она это делает, я хотел бы показывать некую анимацию, пусть банально менять текст в <textarea>... Вычитав, что о многопоточности говорить не приходится, начал копать в сторону асинхронности, и вот я "раскуриваю" setTimeout/setInterval реф которых утверждает что они предназначены для асинхронного вызова функций, казалось бы "то что надо!", а нет... или я не уловил суть (хотя с асинхронностью знаком не по наслышке на серверном Node.js) так вот... пуcть в теле документа имеем некую функцию myStatusBar() , она у нас занимается некой анимацией (добавляет точку к <textarea>*.value) - setInterval(function(){myStatusBar();},500); далее собственно запускаем наш тяжеловесный процесс работы с Excel и файловой системой назовем его myHeavyProcess()(это или последовательный вызов нескольких функций, или вызов одной, которая сама вызывает все последующие //PS: в средем 5-6 сек.) вот что у нас вышло setInterval(function(){myStatusBar();},500); myHeavyProcess(); что ожидалось: функция myStatusBar() будет выполняться каждые 0,5 сек. в то время как будет выполняться myHeavyProcess() что вышло: функция myStatusBar() выполнится один раз, потом будет "шурупить" myHeavyProcess() все свои 5-6 сек. без какой либо анимации, и как только она закончит опять выполнится myStatusBar()... Ну и какая-же это асинхронность ? |
Цитата:
|
Ладно, вот так...
setInterval(function(){myStatusBar();},500); setTimeout(function(){myHeavyProcess();},1000); на выходе то-же самое... |
Я уверен, что я где-то недопонимаю "евангелия" клиентского программирования...
Передо мной стоит задача рисовать анимацию пока выполняются сложные расчеты и взаимодействия, подскажите что мне для этого надо сделать? |
setTimeout/setInterval не создают новый процесс, код выполняется в том же процессе, но с задержкой. Соответственно, если процесс занят, то ничего другое выполниться не сможет.
Цитата:
|
Цитата:
или переписывайте код с шагами,как сказал Kolyaj |
Web Workers - заманчиво, а самое главное НАДО (я пока не столкнулся с "клиенто-шаманизмом" думал, что таки есть нечто подобное уже давно)
но к сожалению в "осле" который мне требо в связи с ActiveX, даже наметок для Web Workers нет, есть правда эмулятор но это в общем-то костыли :)) Я решил так: добавлю к прототипу функции метод вызывающий функцию ответственную за всю анимацию на страничке, ну и собственно, разбивать код на более мелкие фрагменты, между которыми "взывать" к анимации... PS: косяк в том, что это тяжело сделать равномерно. |
И все равно анимации не выходит...
Даже если я линейно в программу повтыкал вызов функции которая рисует анимацию, никаких таймаутов и прочего - все линейно... Все равно... то есть то нет... такое чувство, что она не успевает отрисовываться что-ли... ну в чем может быть дело ? Cмысл такой: есть некий element пусть <textarea id='satus'>Здесь хочу писать статус выполнения</textarea> ну делаю банально myAnimation('выполняется myFunction1') myFunction1() myAnimation('выполняется myFunction2') myFunction2() myAnimation('выполняется myFunction3') myFunction3() myAnimation('выполняется myFunction4') myFunction4() myAnimation('выполняется myFunction5') myFunction5() myAnimation('выполняется myFunction6') myFunction6() myAnimation('Готово') function myAnimation(text){ var element = document.getElementById("status"); element.value = text }; //все myFunction*() это какие ни будь вычисления/манипуляции с объектами ActiveX вешаем все это на button и понеслась... все myFunction*() успешно выполняются одна за одной... а вот в 'satus' отрисовывается только 'выполняется myFunction1'... и висит, потом когда все расчеты закончились быстро мелькает 'выполняется myFunction6' и 'Готово' В чем дело... как заставить отрисовываться в обязательном порядке ? |
Цитата:
|
как быть ?
|
Часовой пояс GMT +3, время: 21:22. |
|