используя setTimeout для цикла - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь написать функцию, которая печатает от 5 до 1 секунды и печатает номер 4 до 2 секунд и печатает 3 до 3 секунд и т. Д.

Я написал эту функцию:

for(let i=5;i>0;i--){
   setTimeout(()=>{
   let localTime = new Date().toLocaleString();
    console.log(`${i} - ${localTime}`)
  },5-i*1000);
}

А это печатает:

'5 - 10/30/2019, 11:10:17 AM'
'4 - 10/30/2019, 11:10:17 AM'
'3 - 10/30/2019, 11:10:17 AM'
'2 - 10/30/2019, 11:10:17 AM'
'1 - 10/30/2019, 11:10:17 AM'

Я написал такой набор утверждений:

console.log(new Date().toLocaleString());

 setTimeout(()=>{
  let localTime = new Date().toLocaleString();
    console.log(`${5} - ${localTime}`)
},1000)

setTimeout(()=>{
  let localTime = new Date().toLocaleString();
    console.log(`${4} - ${localTime}`)
},2*1000)

setTimeout(()=>{
  let localTime = new Date().toLocaleString();
    console.log(`${3} - ${localTime}`)
},3*1000)
setTimeout(()=>{
  let localTime = new Date().toLocaleString();
    console.log(`${2} - ${localTime}`)
},4*1000)
setTimeout(()=>{
  let localTime = new Date().toLocaleString();
    console.log(`${1} - ${localTime}`)
},5*1000)

И вот эти печати:

'10/30/2019, 11:13:45 AM'
'5 - 10/30/2019, 11:13:46 AM'
'4 - 10/30/2019, 11:13:47 AM'
'3 - 10/30/2019, 11:13:48 AM'
'2 - 10/30/2019, 11:13:49 AM'
'1 - 10/30/2019, 11:13:50 AM'

Второй набороператоров увеличивают время на 1 секунду, но установленное время ожидания цикла for не выполняется.

Как добиться функциональности и в чем проблема?

1 Ответ

2 голосов
/ 30 октября 2019

Порядок операций

5 - 1 * 1000
5 - (1*1000)
5 - 1000
-995

Необходимо иметь круглые скобки

},(5-i) * 1000);

Лучший способ без цикла for - просто создать функцию и заставить ее таймер рекурсивно вызывать ее досделано.

function countDown (max) {
   function execute () {
     let localTime = new Date().toLocaleString();
     console.log(`${max} - ${localTime}`)
     max -= 1
     if (max>0) window.setTimeout(execute, 1000)
   }
   execute()
}

countDown(5);
...