Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как совместить setTimeout и цикл for? (https://javascript.ru/forum/misc/65503-kak-sovmestit-settimeout-i-cikl.html)

vlad35 22.10.2016 18:19

Как совместить setTimeout и цикл for?
 
Здравствуйте, уважаемые форумчане! Есть div, который должен менять фон через каждую секунду. Теперь нужно, используя цикл for при каждом прохождении цикла сделать задержку каждого цвета на одну секунду с помощью setTimeout.
Дело в том, что цикл for выдает только последнее прохождение и не хочет задерживаться на каждом цвете. Поискал ответ в интернете, пришел к такому написанию скрипта:

<div style="width:300px; height:300px; background-color:red;" id="col"></div>
<script type="text/javascript">
var color = ["green", "blue", "red", "orange"];
var el = document.getElementById('col');
var max = color.length-1;

for(var i=0; i<=max; i++) {
(function(i){
setTimeout(function(){
el.style.background = color[i];
}, 1000);
})(i);
}
</script>

Но он тоже почему-то не работает. Подскажите, пожалуйста, как все-таки в моем скрипте совместить for и setTimeout.

Aetae 22.10.2016 18:33

Как? Никак.
Цикл выполняется сейчас и только сейчас, таймаут выполняется потом.

Таймаут должен вызывать функцию, которая вызывает следующий таймаут.

destus 22.10.2016 19:38

vlad35,
как вариант...
<div style="width:300px; height:300px; background-color:red;" id="col"></div>
	<script>
	let color = ["green", "blue", "red", "orange"],
	el = document.querySelector('#col'),
	requests = color.reduce((promiseChain, item) => {
		return promiseChain.then(() => new Promise(resolve => {
		  setTimeout(() => (el.style.background = item) && resolve(), 1000)
		}));
	}, Promise.resolve());	
	</script>

Vlasenko Fedor 22.10.2016 19:58

<div style="width:300px; height:300px; background-color:red;" id="col"></div>
<script>
const el = document.getElementById('col');
let iterator = next();
function* next() {
const arr = ["green", "blue", "red", "orange"];
  for (var i = 0; i <= arr.length;) {
    yield arr[i++];
  }
}
  (function newBackground() {
    let color = iterator.next().value;
    if (color) {
      el.style.background = color;
      setTimeout(newBackground, 1000);
    }
  }());
</script>

песочница
но зачем вам это, есть более простые решения данного функционала

Aetae 22.10.2016 20:02

Poznakomlus, годный овермайнд.))

Vlasenko Fedor 22.10.2016 20:13

Aetae,
особо не понял зачем ТС эти варианты
http://www.cyberforum.ru/javascript-...ad1830841.html

рони 22.10.2016 20:40

:)
<div style="width:300px; height:300px; background-color:red;" id="col"></div>
  <script>
  var color = ["green", "blue", "red", "orange"],
  el = document.querySelector('#col');
  (function f() {
   var item = color.shift();
   item && (el.style.background = item) && setTimeout(f, 1000)
  }())
  </script>

Vlasenko Fedor 22.10.2016 20:57

рони,
Цитата:

Сообщение от vlad35
нужно, используя цикл for

:)
Цитата:

Сообщение от vlad35 (Сообщение 432615)
совместить for и setTimeout.


рони 22.10.2016 21:18

Poznakomlus,
ок. но но зачем усложнять
Цитата:

Сообщение от Aetae
Цикл выполняется сейчас и только сейчас, таймаут выполняется потом.

Таймаут должен вызывать функцию, которая вызывает следующий таймаут.


Vlasenko Fedor 22.10.2016 21:38

Цитата:

Сообщение от рони
Цикл выполняется сейчас и только сейчас

может стоит задача написания кода с использованием генераторов
Цитата:

Сообщение от Poznakomlus
особо не понял зачем ТС эти варианты



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