@FlapJalc

Как получать элементы массива по очереди по кругу с задержкой?

Написал код который читает данные из массива, и выводит их по очереди с полутора секундной задержкой. Но после того как все данные считываются, мне нужно заново запускать этот цикл. Была идея поместить это всё в while (true), но это оказалось плохой идеей. Пытался гуглить, но меня постоянно кидало на статью по замыканиям. Тут и правда нужно использовать замыкания? Если да, то как

<p>Открыть <b class="slide-words">замок</b></p>

var keys = ['замок', 'машину', 'сейф'];

for (var i = 0; i < keys.length; i++) {
  slideTime(i)
}

function slideTime(j) {
  setTimeout(function() {
    var slideWords = document.querySelector('.slide-words');
    slideWords.textContent = keys[j];
  }, 1500 * j);
}
  • Вопрос задан
  • 528 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
О каком массиве идёт речь, через какой промежуток надо получать его элементы и что с ними делать:

const options = [
  [ 'hello, world!!', 'fuck the world', 'fuck everything' ],
  500,
  (elem => item => elem.textContent = item)
  (document.querySelector('.slide-words')),
];

Можно устанавливать интервал:

function interval(arr, delay, callback) {
  let i = -1;

  return arr.length
    ? setInterval(() => callback(arr[i = -~i % arr.length]), delay)
    : null;
}


const intervalId = interval(...options);
// надо остановить, делаем так: clearInterval(intervalId);

Или воспользоваться рекурсивными таймаутами:

function interval(arr, delay, callback) {
  let timeoutId = null;

  arr.length && (function next(i) {
    timeoutId = setTimeout(() => {
      callback(arr[i]);
      next((i + 1) % arr.length);
    }, delay);
  })(0);

  return () => clearTimeout(timeoutId);
}


const stop = interval.apply(null, options);
// надо остановить, делаем так: stop();
Ответ написан
potapchino
@potapchino
через рекурсию можно
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы