代码之家  ›  专栏  ›  技术社区  ›  Matthew

如何用超时重置for循环参数

  •  2
  • Matthew  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  1
  •   Mark    7 年前

    我认为实现这一目标的更好方法是 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)