@andrushqeqeqtx

Почему интервал в setTimeout не изменяется?

Добрые люди, объясните пжлуста почему в функции
setDelay = param => {
  setTimeout(() => console.log(param), param*1000)
}

for(var i = 0; i < 10; i++) {
  setDelay(i);
}

выводится от 1 до 9 через односекундные промежутки а не через увеличивающиеся интервалы, по идее у нас переменная param меняется, следовательно param*1000 тож должно меняться но этого не происходит. Спасибо
  • Вопрос задан
  • 116 просмотров
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
В нулевой момент времени вы запускаете десять интервалов. Каждый из них срабатывает именно "через увеличивающиеся интервалы" - первый сразу, второй через секунду с момента установки, третий через две секунды и так далее.

Вот так должно быть понятнее:
setDelay = param => {
  setTimeout(() => console.log("выполнен", param), param*1000)
}

for(var i = 0; i < 10; i++) {
  setDelay(i);
  console.log("установлен", i);
}


Если же вы хотите устроить именно "лесенку", код будет сложнее:
setDelay = async (param) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("выполнен", param);
      resolve();
    }, param * 1000);
  })
}

for(var i = 0; i < 10; i++) {
  console.log("установлен", i);
  await setDelay(i);
}
Ответ написан
@Cruper
web-падаван
setTimeout не останавливает выполнение потока, соответственно в один момент времени вы устаналиваете сразу 10 таймаутов от 1 до 10 секунд.
Чтобы сделать так, как вы хотите, но без Promise'ов, рекомендую рекурсивные вызовы setTimeout
let tick = (delay, end) => {
  if (delay >= end) {
    return
  }
  setTimeout(() => {
    alert('hola')
    tick(delay + 1, end)
  }, delay * 1000)
}
tick(1, 10) // Выведет 'hola' 10 раз с разными увеличивающимися интервалами
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы