@Elvizlir

Как задать задержку в цикле for?

Здравствуйте! Учу javascript, для интереса решил написать простую программку, которая спрашивает у пользователя число и рисует заданное количество разноцветных кружков в пределах экрана. Всё работает через цикл for, но я хочу что бы они все появлялись не одновременно, а с задержкой в 100мс. Пытался вызвать функцию в цикле через setTimeout, но задержка происходит единожды, после чего всё рисуется сразу. Прошу дать совет, что, как и куда писать, что бы всё работало. Спасибо.

let $body = document.querySelector('body');
let $bodyH = $body.clientHeight;
let $bodyW = $body.clientWidth;
let ask = prompt('How many circles you want to draw?');

if (ask !== null || ask !== '') {
  for (let i = 0; i < ask; i++) {
    drowCircle(i);
  }
}

function drowCircle(i) {
  let $circle = document.createElement('div');
  let $circleSize = getRand(50, 100);
  let positionX = getRand(0, $bodyW - $circleSize);
  let positionY = getRand(0, $bodyH - $circleSize);

  $body.insertAdjacentElement('afterbegin', $circle);

  $circle.style.width = $circle.style.height = `${$circleSize}px`;
  $circle.style.zIndex = i+1;
  $circle.style.backgroundColor = `rgb(${getRand(0,255)},${getRand(0,255)},${getRand(0,255)})`;
  $circle.style.borderRadius = '50%';
  $circle.style.position = 'absolute';
  $circle.style.top = `${positionY}px`;
  $circle.style.left = `${positionX}px`;
}

function getRand(min, max) {
  let rand = min - 0.5 + Math.random() * (max - min + 1);
  return Math.round(rand);
}
  • Вопрос задан
  • 278 просмотров
Решения вопроса 1
@RMate
if (ask !== null || ask !== '') {
  for (let i = 0; i < ask; i++) {
    setTimeout(() => {
      drowCircle(i);
    }, i * 100);
  }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Interface
let $body = document.querySelector('body');
let $bodyH = $body.clientHeight;
let $bodyW = $body.clientWidth;

function sleep(ms) {
	return new Promise(resolve => setTimeout(resolve, ms));
}

async function main() {
	let ask = prompt('How many circles you want to draw?');

  if (ask !== null || ask !== '') {
    for (let i = 0; i < ask; i++) {
      drowCircle(i);
      await sleep(1000);
    }
  }
}

main();

function drowCircle(i) {
  let $circle = document.createElement('div');
  let $circleSize = getRand(50, 100);
  let positionX = getRand(0, $bodyW - $circleSize);
  let positionY = getRand(0, $bodyH - $circleSize);

  $body.insertAdjacentElement('afterbegin', $circle);

  $circle.style.width = $circle.style.height = `${$circleSize}px`;
  $circle.style.zIndex = i+1;
  $circle.style.backgroundColor = `rgb(${getRand(0,255)},${getRand(0,255)},${getRand(0,255)})`;
  $circle.style.borderRadius = '50%';
  $circle.style.position = 'absolute';
  $circle.style.top = `${positionY}px`;
  $circle.style.left = `${positionX}px`;
}

function getRand(min, max) {
  let rand = min - 0.5 + Math.random() * (max - min + 1);
  return Math.round(rand);
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Sportrecs Москва
от 150 000 до 200 000 ₽
27 нояб. 2020, в 20:11
10000 руб./за проект
27 нояб. 2020, в 19:42
5000 руб./за проект
27 нояб. 2020, в 19:12
10000 руб./за проект