22.10.2016, 18:19
|
Новичок на форуме
|
|
Регистрация: 22.10.2016
Сообщений: 9
|
|
Как совместить 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.
|
|
22.10.2016, 18:33
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Как? Никак.
Цикл выполняется сейчас и только сейчас, таймаут выполняется потом.
Таймаут должен вызывать функцию, которая вызывает следующий таймаут.
__________________
29375, 35
|
|
22.10.2016, 19:38
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
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>
|
|
22.10.2016, 19:58
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
<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>
песочница
но зачем вам это, есть более простые решения данного функционала
Последний раз редактировалось Vlasenko Fedor, 22.10.2016 в 20:11.
|
|
22.10.2016, 20:02
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Poznakomlus, годный овермайнд.))
__________________
29375, 35
|
|
22.10.2016, 20:13
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
|
|
22.10.2016, 20:40
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
<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>
|
|
22.10.2016, 20:57
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
рони,
Сообщение от vlad35
|
нужно, используя цикл for
|
Сообщение от vlad35
|
совместить for и setTimeout.
|
|
|
22.10.2016, 21:18
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
Poznakomlus,
ок. но но зачем усложнять
Сообщение от Aetae
|
Цикл выполняется сейчас и только сейчас, таймаут выполняется потом.
Таймаут должен вызывать функцию, которая вызывает следующий таймаут.
|
|
|
22.10.2016, 21:38
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
Сообщение от рони
|
Цикл выполняется сейчас и только сейчас
|
может стоит задача написания кода с использованием генераторов
Сообщение от Poznakomlus
|
особо не понял зачем ТС эти варианты
|
|
|
|
|