Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.03.2015, 15:36
Интересующийся
Отправить личное сообщение для Poveritov Посмотреть профиль Найти все сообщения от Poveritov
 
Регистрация: 28.11.2011
Сообщений: 21

Не работает settimeout в цикле
Простой пример
var l=1
for(var i=0; i<10; ++i){
      (function(e){
            setTimeout(function(){
                      if(l==1){
                          $('#component-1').css('background-color','#dddddd');
                            l=2;
                      }
                        if(l==2){
                                $('#component-1').css('background-color','red');
                             l=1;
                      }
                                                                    
         },5000);
    })(i)
                                                        
}

Как я вижу это, десять раз будет изменен цвет у блока через каждые 5 сек.

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

Подскажите, где ошибки и почему нет желаемого результата?
Ответить с цитированием
  #2 (permalink)  
Старый 31.03.2015, 16:06
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,232

Сообщение от Poveritov
Как я вижу это, десять раз будет изменен цвет у блока через каждые 5 сек.
А на деле просто запущено 10 потоков, каждый из которых просто выполнит, что в нем написано...

Как некая иллюстрация содеянного...

<!DOCTYPE html>
<html>
<head>
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
for(var i=0; i<10; ++i){
	(function(N){
		setTimeout(function(){
			var o=document.createElement('P');
			o.innerHTML=N;
			document.getElementById('test').appendChild(o);
			
		},5000);
	})(i)
};
</script>
</head>
<body>
<div id='test'></div>
</body>
</html>

Последний раз редактировалось ksa, 31.03.2015 в 16:11.
Ответить с цитированием
  #3 (permalink)  
Старый 31.03.2015, 16:12
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,232

Сообщение от Poveritov
Подскажите, где ошибки и почему нет желаемого результата?
В не понимании принципа работы setTimeout()...
Ответить с цитированием
  #4 (permalink)  
Старый 31.03.2015, 16:19
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,232

Как вариант...

<!DOCTYPE html>
<html>
<head>
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
#test {
	background-color: #dddddd;
}
</style>
<script type='text/javascript'>
$(function(){
	for (var i=0; i<10; ++i){
		(function(e){
			setTimeout(function(){
				var o=$('#test');
				if (o.data('iteration')==1){
					o.css('background-color','#dddddd');
					o.data('iteration',2);
				} else {
					o.css('background-color','red');
					o.data('iteration',1);
				}

			},5000*(i+1));
		})(i)
	};
});
</script>
</head>
<body>
<div id='test'>Test</div>
</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 31.03.2015, 17:05
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от ksa
А на деле просто запущено 10 потоков, каждый из которых просто выполнит, что в нем написано...
А JS уже стал многопоточным?
Ответить с цитированием
  #6 (permalink)  
Старый 31.03.2015, 17:21
Интересующийся
Отправить личное сообщение для Poveritov Посмотреть профиль Найти все сообщения от Poveritov
 
Регистрация: 28.11.2011
Сообщений: 21

Сообщение от ksa Посмотреть сообщение
Как вариант...

<!DOCTYPE html>
<html>
<head>
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
#test {
	background-color: #dddddd;
}
</style>
<script type='text/javascript'>
$(function(){
	for (var i=0; i<10; ++i){
		(function(e){
			setTimeout(function(){
				var o=$('#test');
				if (o.data('iteration')==1){
					o.css('background-color','#dddddd');
					o.data('iteration',2);
				} else {
					o.css('background-color','red');
					o.data('iteration',1);
				}

			},5000*(i+1));
		})(i)
	};
});
</script>
</head>
<body>
<div id='test'>Test</div>
</body>
</html>
Работает как нужно, спасибо за помощь!
Ответить с цитированием
  #7 (permalink)  
Старый 01.04.2015, 08:35
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,232

Сообщение от jsnb
А JS уже стал многопоточным?
Назови асинхронный запуск функции как тебе больше нравится...
Ответить с цитированием
  #8 (permalink)  
Старый 12.04.2017, 00:09
Интересующийся
Отправить личное сообщение для mcreature Посмотреть профиль Найти все сообщения от mcreature
 
Регистрация: 24.05.2014
Сообщений: 12

Добрый вечер!
А как быть с 2-мя setTimeout в цикле, которые должны выполняться по очереди?

for(var i = 0; i <= 7; i++) {
							(function(e) {
								setTimeout(function() {
									$('#block2 .variant:eq(' + e + ')').addClass('active');
									setTimeout(function() {
										$('#block2 .variant:eq(' + e + ')').removeClass('active');
									}, timeout);	
								}, timeout);	
							})(i);	
							timeout += 200;
						}


Сейчас сначала 10 раз выполняется один setTimeout, потом 10 раз другой. А должны они выполняться по очереди.
Ответить с цитированием
  #9 (permalink)  
Старый 12.04.2017, 08:26
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,232

mcreature, цикл убрать совсем. А setTimeoutы запускать друг из друга нужное количество раз...
Ответить с цитированием
  #10 (permalink)  
Старый 12.04.2017, 12:00
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

Кроме setTimeout есть setInterval. Возможно, разобраться с ним будет проще.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает код внутри циклов DZHETIGAPA Events/DOM/Window 1 21.06.2011 01:03
уменьшение opacity работает, увеличение - не работает Polkan Общие вопросы Javascript 10 17.06.2011 13:02
подскажите как работает setTimeout ruslan368560 Общие вопросы Javascript 1 17.05.2011 18:48
помогите найти ошибку (работает в IE но не работает в Firefox) Len4ik Javascript под браузер 2 11.05.2010 15:41
ajax запросы, работает на одних компах и не работает на других vtornik23 AJAX и COMET 2 22.03.2010 18:22