Переменные в функции setTimeout не работают непрерывно - PullRequest
1 голос
/ 29 января 2020

Моя проблема в том, что мой l oop с функцией SetTimeout работает, но мне нужно, чтобы он вычитал одну переменную из другой каждые 50 мс, но это работает только один раз. Вот мой код:

<label for="customRange1">Weighting <output id="amount1" name="amount1" for="rangeInput1">100</output>%</label>
                        <input type="range" id="customRange1" name="rangeInput1" class="custom-range" min="0" max="100" value="100"
                               oninput="this.form.amount1.value=this.value">
<p id="display"></p>
 function input1(ev) {
     function1();
    var outputvalue1 = document.getElementById('amount1').value;
}
document.getElementById('customRange1').addEventListener('input', input1);



var weightingall = 100;
function function1(){
     var weighting1 = outputvalue1;
     var inputmax = weightingall - weighting1;
    document.getElementById("display").innerHTML = test5;
    setTimeout(function1, 50);
}

function1();

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Если вы хотите сделать интервал, вы не должны использовать setTimeout, а setInterval.

Функция setInterval работает так же, как и setTimeout, она требует обратного вызова и количество миллисекунд. Он также возвращает объект интервала, который можно использовать для остановки интервала при передаче его в функцию clearInterval.

Ваш код не работал, поскольку вы никогда не меняли значение weightingall. Таким образом, вы будете получать одну и ту же сумму каждый раз.

Здесь я создаю рабочий прототип вашего кода. Обратите внимание, что я удалил несколько вещей, чтобы заставить его работать должным образом. Вы не можете просто скопировать и вставить это в свой код, ожидая, что все будет работать.

var weightingall = 100;
let interval = setInterval(() => {
  var weighting1 = 10;
  // we remove 10 each time.
  weightingall = weightingall - weighting1;
  document.getElementById("display").innerHTML = weightingall;
  // if the weightingall variable comes down to 0, we clear the interval.
  if(weightingall <= 0 ){
    clearInterval(interval);
  }
}, 1000);
<div id="display"></div>

Обратите внимание, что я использовал функцию стрелки и let здесь для определения объема.
Вы должны всегда использовать let / const вместо var

0 голосов
/ 29 января 2020

Это может помочь?

let counter = 100;

function countdown() {
    console.log(counter--)        
    if(counter >= 0) { setTimeout(countdown, 50) }
}
countdown()
...