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

Kolyaj 17.08.2011 12:53

Каждую следующую myFunction вызывать через setTimeout

RUVATA 17.08.2011 14:24

здесь представлен список свойств обращение к которым вызывает немедленный redraw элемента:
1. offsetTop, offsetLeft, offsetWidth, offsetHeight,
2. scrollTop/Left/Width/Height,
3. clientTop/Left/Width/Height,
4. getComputedStyle() или currentStyle в IE.
...фактически в IE8 100% работают только 1-ые...
На одном из англ.форумов вычитал
Цитата:

I use the following:

elm.style.display=”none”;
var redrawFix = elm.offsetHeight;
elm.style.display=”block”; // or other value if required

This works in all browsers I have needed it for – Opera, Konqueror, Safari and IE (including IE8 RC1 for which I just needed a redraw fix too). I haven’t ever needed it for Firefox though..
хотя у меня работает и без изменения свойства display, далее автор утверждает что именно такая конструкция работает всегда.

RUVATA 17.08.2011 14:28

Цитата:

Каждую следующую myFunction вызывать через setTimeout
без толку... пробовал...
Дело было в баге самого IE :
пока идет непосредственная работа с COM-компонентами в моем случае ActiveX, IE для повышения производительности отключает все вcтроенные redraw / reflow... хочешь что-то отрисовать - вызывай его принудительно. ("как?" - постом выше)

RUVATA 18.08.2011 13:25

И так окончательная точка
JavaScript у клиента в данный момент (не берем в расчет Web Workers которые еще "будующее") не выполняется асинхронно никак.
setTimeout и setInterval - вопреки рефу, псевдоасинхронность т.е.
управление не совмещает выполнение кодов разных функций за один такт...

Kolyaj 18.08.2011 13:32

Цитата:

Сообщение от RUVATA
setTimeout и setInterval - вопреки рефу, псевдоасинхронность т.е.

Нормальная там асинхронность. Вы по какой-то причине считаете, что асинхронность == многопоточность, что не есть правда.

popov654 19.08.2011 00:46

********************

Gvozd 19.08.2011 04:02

Цитата:

Сообщение от RUVATA
setTimeout и setInterval - вопреки рефу, псевдоасинхронность т.е.
управление не совмещает выполнение кодов разных функций за один такт...

когда одновременно выполняются две функции - это многопоточность.
а ассинхронность(в браузерном JS) - явление строго однопоточное.
ассинхронность позволяет положить функции в очередь, до наступления события, когда они смогут выполниться. При этом они вовсе не обязаные выполнятся одновременно, и даже не гарантируется что они выполнятся в указанном вами порядке(в случае когда они должны сработать "одноврменно").

RUVATA 19.08.2011 08:12

Вам как JavaScript-ерам должна быть знакома технология серверного JavaScript - NODE.js, вот здесь часть идеологии асинхронности...
Более того, не хотел бы с вами спорить, но видимо вы заблуждаетесь...
Цитата:

Сообщение от Gvozd
когда они смогут выполниться.

не когда они смогут, а тогда когда они должны будут выполниться - в этом суть асинхронности (таймеры и коллбэки).
Т.е. по наступлению события или таймера, исполнение текущего контекста приостанавливается, и исполняется контекст назначенный, после чего возобновляется выполнение текущего...
В нашем-же случае setTimeout и setInterval являются таймерами, но они не останавливают выполнение основного контекста, а покорно ждут пока контекст исполнится...

float 19.08.2011 08:34

Цитата:

в этом суть асинхронности
суть асинхронности в том, что функция будет выполняться в неизвестный момент времени.
Цитата:

а тогда когда они должны
никто ничего не должен. в том то и дело.

RUVATA 19.08.2011 08:46

вот некий код для "разбора полетов"
<html>
 <head> </head>
 
<body>
 <script type="text/javascript">
		
		AsyncTest()
	
	function AsyncTest(){
		var someText = ''

		setInterval(function(){someText = someText + '-AsyncInjection-';}, 12)

		for(var i = 0; i < 20; i++){
		  someText = someText + '-MainTheadInjection-'
		};

		alert(someText)
	}
	</script>
</body>

 <html>

что-же увидите на выходе ?
Цитата:

-MainTheadInjection--MainTheadInjection--MainTheadInjection--MainTheadInjection--MainTheadInjection--MainTheadInjection--MainTheadInjection--MainTheadInjection--MainTheadInjection--MainTheadInjection--MainTheadInjection- ...
Ну и где-же асинхронный вызов ? хотя если бы код выполнялся асинхронно мы бы увидели:
Цитата:

-MainTheadInjection--MainTheadInjection--AsyncInjection--MainTheadInjection--MainTheadInjection--MainTheadInjection--MainTheadInjection--AsyncInjection--MainTheadInjection--MainTheadInjection--MainTheadInjection--AsyncInjection- ...
Чувствуете разницу ?
проведите аналогичный эксперимент в NODE.js :)


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