Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   setTimeout/setInterval - неожиданное поведение (https://javascript.ru/forum/misc/20782-settimeout-setinterval-neozhidannoe-povedenie.html)

RUVATA 17.08.2011 08:55

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()...

Ну и какая-же это асинхронность ?

Kolyaj 17.08.2011 09:03

Цитата:

Сообщение от RUVATA
Ну и какая-же это асинхронность ?

А где вы написали, что myHeavyProcess у вас асинхронная? А раз она не асинхронная, то она занимает поцесс, пока выполняется. Раз она занимает процесс, все остальные ждут, пока она выполнится.

RUVATA 17.08.2011 09:08

Ладно, вот так...
setInterval(function(){myStatusBar();},500);
setTimeout(function(){myHeavyProcess();},1000);

на выходе то-же самое...

RUVATA 17.08.2011 09:13

Я уверен, что я где-то недопонимаю "евангелия" клиентского программирования...
Передо мной стоит задача рисовать анимацию пока выполняются сложные расчеты и взаимодействия, подскажите что мне для этого надо сделать?

Kolyaj 17.08.2011 09:33

setTimeout/setInterval не создают новый процесс, код выполняется в том же процессе, но с задержкой. Соответственно, если процесс занят, то ничего другое выполниться не сможет.

Цитата:

Сообщение от RUVATA
Передо мной стоит задача рисовать анимацию пока выполняются сложные расчеты и взаимодействия, подскажите что мне для этого надо сделать?

Поделить сложные расчёты на куски, между которыми делать паузы.

melky 17.08.2011 09:58

Цитата:

Сообщение от RUVATA (Сообщение 121004)
Я уверен, что я где-то недопонимаю "евангелия" клиентского программирования...
Передо мной стоит задача рисовать анимацию пока выполняются сложные расчеты и взаимодействия, подскажите что мне для этого надо сделать?

хотите настоящей асинхронности - гуглите Web Workers

или переписывайте код с шагами,как сказал Kolyaj

RUVATA 17.08.2011 10:40

Web Workers - заманчиво, а самое главное НАДО (я пока не столкнулся с "клиенто-шаманизмом" думал, что таки есть нечто подобное уже давно)
но к сожалению в "осле" который мне требо в связи с ActiveX, даже наметок для Web Workers нет, есть правда эмулятор
но это в общем-то костыли :))
Я решил так: добавлю к прототипу функции метод вызывающий функцию ответственную за всю анимацию на страничке, ну и собственно, разбивать код на более мелкие фрагменты, между которыми "взывать" к анимации...
PS: косяк в том, что это тяжело сделать равномерно.

RUVATA 17.08.2011 11:54

И все равно анимации не выходит...
Даже если я линейно в программу повтыкал вызов функции которая рисует анимацию, никаких таймаутов и прочего - все линейно...
Все равно... то есть то нет... такое чувство, что она не успевает отрисовываться что-ли... ну в чем может быть дело ?
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' и 'Готово'

В чем дело... как заставить отрисовываться в обязательном порядке ?

Kolyaj 17.08.2011 12:01

Цитата:

Сообщение от RUVATA
myAnimation('выполняется myFunction1')
myFunction1()
myAnimation('выполняется myFunction2')
myFunction2()
myAnimation('выполняется myFunction3')
myFunction3()
myAnimation('выполняется myFunction4')
myFunction4()
myAnimation('выполняется myFunction5')
myFunction5()
myAnimation('выполняется myFunction6')
myFunction6()
myAnimation('Готово')

Вот это всё выполняется разом, без перерыва, браузеру тут некуда втиснуться, чтобы отрисовать то, что выводится.

RUVATA 17.08.2011 12:48

как быть ?


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