задержка с заданным временем и для цикла - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть этот код отсюда: Как добавить задержку в цикле JavaScript? Я использую его в консоли в IE, и после этого кода я вызываю функцию с myFunction () в консоли длябежать;Этот первый код работает отлично, он щелкает по второму элементу с тегом «что-то» 10 раз, а между щелчками задержка составляет 3000 мс.

function myFunction() {
    (function myLoop (i) {          
    setTimeout(function () {   
    document.getElementsByTagName("something")[1].click();                
    if (--i) myLoop(i);      //  decrement i and call myLoop again if i > 0
   }, 3000)
})(10);
}

Я хотел бы изменить число «1» в этом коде нацикл foor, поэтому я хочу создать код, который нажимает на элементы с именем «что-то».Я создал этот код, но он не работает:

for (x=1;x<10;x++){
function myFunction() {
(function myLoop (i) {          
    setTimeout(function () {   
    document.getElementsByTagName("something")[1].click();                
    if (--i) myLoop(i);      //  decrement i and call myLoop again if i > 0
   }, 3000)
})(10);
}

}

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Если вы хотите печатать каждый элемент с интервалом, вам нужно умножить значение синхронизации на целое число, в противном случае все они будут зарегистрированы одновременно.

Также вам может не понадобиться создавать myFunction внутри петли

for (var x = 1; x < 5; x++) {
  (function(i) {
    setTimeout(function() {
      console.log(i);
    }, i * 1000)
  }(x))
}
0 голосов
/ 21 ноября 2018

Обычно проще использовать setInterval, чем цикл с setTimeout.Все просто проще:

var count = 10
var intv = setInterval(function(){
  if (count === 0 ) {
    clearInterval(intv)
    console.log("done")
    return
   }
  // do something
  console.log(count--)
}, 1000)

Но вы можете рекурсивно позвонить setTimeout:

(function myLoop (i) {          
    setTimeout(function () {   
      console.log("loop: ", i)
      if (--i) myLoop(i);      
   }, 1000)
})(10);

Поместить все это в цикл for И вызвать его рекурсивно, хотя это странно, потому что цикл будет работать и делать кучу отдельных таймаутов, которые все будут работать независимо, чтоЯ не думаю, что вы хотите.

0 голосов
/ 21 ноября 2018

function myFunction() {
    (function myLoop (i) {          
        setTimeout(function () {   
        document.getElementsByTagName("div")[1].click();                
        if (--i) myLoop(i);      //  decrement i and call myLoop again if i > 0
        }, 3000)
    })(10);
  }

for (x=1;x<10;x++){
  myFunction();
}
<div>1</div>

Попробуйте вот так.Я использовал div вместо something

...