Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.12.2020, 04:41
Профессор
Отправить личное сообщение для savsoft Посмотреть профиль Найти все сообщения от savsoft
 
Регистрация: 03.01.2019
Сообщений: 155

setTimeout в цикле.
Есть массив, необходимо его обработать в цикле, но с паузами во время обработки.

Типа

for (var i = 0; i < 1000; i++) {
		setTimeout(function(){ 
			$("#demo").click().delay(1000);
			console.log('Click');
			// Еще код
		}, 1000);
	}


Необходимо, чтобы код выполнялся через каждую секунду, а не сразу.

Куда копать?

UPDATE.

Думаю вынести код в функцию, а функцию вызывать через SetInterval

Последний раз редактировалось savsoft, 16.12.2020 в 05:03.
Ответить с цитированием
  #2 (permalink)  
Старый 16.12.2020, 07:31
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,693

Что это за конструкция
$("#demo").click().delay(1000);
я не понял, но обычно так делают

var i = 0;
function fd () {
  $("#demo").click()
  console.log('Click');
  // Еще код
  if (i++ < 1000) setTimeout (fd, 1000)
}
setTimeout (fd, 1000)


Или так
const delay = (n) => {
	return new Promise (res => {
		let tm = setTimeout (() => res(tm), n);
	})
}

const fd = async () => {
   for (let i = 0; i < 1000; i++) {
      await delay(1000);
      $("#demo").click()
      console.log('Click');
      // Еще код
   }
}

fd ()
// Или await fd()

Последний раз редактировалось voraa, 16.12.2020 в 07:39.
Ответить с цитированием
  #3 (permalink)  
Старый 16.12.2020, 10:57
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

const it = cycle(['A', 'B', 'C', 'D', 'E'])
let timer1;

function* cycle(arr) {
    let i = 0;
    while (i < arr.length) yield arr[i++]
}

(function timer() {
    timer1 = setTimeout(function () {
        const cur = it.next();
        if (cur.done) {
            clearTimeout(timer1);
        } else {
            console.log(cur.value);
            timer();
        }
    }, 1000);
}());

Вариант с генераторами
https://learn.javascript.ru/generator
Ответить с цитированием
  #4 (permalink)  
Старый 16.12.2020, 14:32
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от voraa
let tm = setTimeout (() => res(tm), n);
просто интересно - зачем в then получать ссылку на отработавший таймер?

полезнее было бы передать какие-то данные:
const delay = (ms, data) => new Promise(res => setTimeout(res, ms, data));

delay(1000, 'hello').then(console.log);
Ответить с цитированием
  #5 (permalink)  
Старый 16.12.2020, 17:45
Профессор
Отправить личное сообщение для savsoft Посмотреть профиль Найти все сообщения от savsoft
 
Регистрация: 03.01.2019
Сообщений: 155

Всем спасибо, по простому сделал, теперь буду разбираться дальше.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли применять setTimeout внутри цикла? MC-XOBAHCK Общие вопросы Javascript 12 27.04.2018 17:34
Не работает settimeout в цикле Poveritov Общие вопросы Javascript 10 12.04.2017 19:38
Вопрос по задержке setTimeout в цикле BirviZ Общие вопросы Javascript 2 25.04.2015 10:29
setTimeout в цикле freezecoder Общие вопросы Javascript 4 10.12.2014 09:42
setTimeout в цикле Skoldin Общие вопросы Javascript 10 28.11.2013 16:16