Как сбросить параметр цикла с тайм-аутом - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь запускать функцию каждые 10 мс и запускать функцию заново, если значение достигает определенного порога.

Как я могу запустить эту процедуру снова, если value > 10?

let x = 0
let ln = 12

function getValue() {
  // Returns an integer value
}

for (x; x <= ln; x++) {
  setTimeout(() => {
    getValue((value) => {
      if(value > 10) x = 0; // Restart for loop - doesn't seem to be working as intended
      if(x == 12) // do something else
    })
  }, 10)
}

1 Ответ

0 голосов
/ 20 сентября 2018

Я думаю, что лучший способ добиться чего-то подобного - setInterval.Сохраняйте счетчик, который увеличивается с каждым вызовом, до setInterval(), если счетчик достигает предела, очистите интервал с помощью clearInterval.Если он удовлетворяет какому-либо другому условию, сбросьте счетчик на ноль:

let nums = [1, 2, 3, 12, 4, 1, 2, 4, 6, 3]
let i = 0
function getValue(fn){
    fn(nums[i % nums.length])
    i++
}

const MAX_ITERATIONS = 10

let iteration = 0
let int = setInterval(() => {
    getValue((value) => {
        if(value > 10) iteration = 0; // Reset the counter
        else iteration++
    })
    console.log("loop iteration: ", iteration)
    if (iteration >= MAX_ITERATIONS) clearInterval(int)
}, 1000)

При меньшем значении MAX_ITERATIONS он достигнет конца цикла, прежде чем получит значение больше 10 во второй раз, и остановится:

let nums = [1, 2, 3, 12, 4, 1, 2, 4, 6, 3]
let i = 0
function getValue(fn){
    fn(nums[i % nums.length])
    i++
}

const MAX_ITERATIONS = 4

let iteration = 0
let int = setInterval(() => {
    getValue((value) => {
        if(value > 10) iteration = 0; // Reset the counter
        else iteration++
    })
    console.log("loop iteration: ", iteration)
    if (iteration >= MAX_ITERATIONS) clearInterval(int)
}, 1000)
...