计数和倒计时循环

时间:2013-09-06 21:14:23

标签: javascript setinterval

我想从3减少到0然后在循环中回到3。这是一种“滑块”实现。一切正常,直到从clearInterval到达counterry。我错过了什么?

var counttx = 0, // counter
    counterrx = setInterval(timerrx, 1000), // countup - start
    counterry; // countdown after reach 3

function timerrx(){
    counttx = counttx+1;
    //console.log(counttx);
    if(counttx > 2){
        counterry = setInterval(timerry, 1000); 
        clearInterval(counterrx);
    }
}

function timerry(){
   counttx = counttx-1;
   //console.log(counttx);
   if(counttx < 2){
       setInterval(timerrx, 1000);
       clearInterval(counterry);
   }
}

3 个答案:

答案 0 :(得分:5)

使用单个循环:

var counttx = 0, countup = true;

function timerr()
{
  if (countup)
  {
    ++counttx;
    if (counttx >= 3)
      countup = false;
  }
  else
  {
    --counttx;
    if (counttx <= 0)
      countup = true;
  }
}

setInterval(timerr, 1000);

工作示例:http://codepen.io/paulroub/pen/weuxk

答案 1 :(得分:3)

代码

let i = 0;
setInterval(() => {
  console.log(Math.abs(i++%6 - 3))
}, 1000);

解构

  1. i++i每次滴答地无限增加一次
  2. %6→最大v值的两倍的模(除以10 % 6 = 4之后的除法数)
  3. - 3→删除范围(因此数字将始终在3到-3之间,否则将在0到6之间)
  4. Math.abs()→删除-(确保数字从0到3并返回)

可视化的步骤

i ++

∞       .
       .
      .
     /
    /
   / 
  /
0

i ++%6

6 
     /    /    /    .
    /    /    /    .
   /    /    /    .
  /    /    /    /
 /    /    /    /
0

i ++%6-3

3 
  \        /\        /\
   \      /  \      /  \
0   \    /    \    /    .
     \  /      \  /      .
      \/        \/        .
-3

Math.abs(i ++%6-3)

3 
  \    /\    /.
   \  /  \  /  .
    \/    \/    .
0

第一个8次迭代的示例输出:

  1. i 0

    1. 0%6 0
    2. 0-3 -3
    3. Math.abs(-3) 3
  2. i 1

    1. 1%6 1
    2. 1-3 -2
    3. Math.abs(-2) 2
  3. i 2

    1. 2%6 2
    2. 2-3 -1
    3. Math.abs(-1) 1
  4. i 3

    1. 3%6 3
    2. 3-3 0
    3. Math.abs(0) 0
  5. i 4

    1. 4%6 4
    2. 4-3 1
    3. Math.abs(1) 1
  6. i 5

    1. 5%6 5
    2. 5-3 2
    3. Math.abs(2) 2
  7. i 6

    1. 6%6 0
    2. 0-3 -3
    3. Math.abs(-3) 3
  8. i 7

    1. 7%6 1
    2. 1-3 -2
    3. Math.abs(-2) 2

实施示例

const max = 10
let i = max;
const $body = document.querySelector('body');

setInterval(() => {
  const val = Math.abs(i++%(max * 2) - max);
  const $el = document.createElement('i');
  $el.style = `--i: ${i}; --val: ${val}`;
  $body.appendChild($el);
  window.scrollTo(window.innerWidth, 0);
  console.log(val);

}, 200);
i {
  --i: 0;
  --val: 0;
  --size: 10px;
  
  position: absolute;
  background: black;
  width: var(--size);
  height: var(--size); 
  top: var(--size);
  left: calc(-10 * var(--size));
  transform: translate(
    calc(var(--i) * var(--size)),
    calc(var(--val) * var(--size))
  )
}

替代方法

Math.acos(Math.cos(i * Math.PI)) / Math.PI;


Math.abs(i - Math.floor(i) - .5);

ifloat-0之间的Infinity。结果也是float,也需要乘以最大和四舍五入(目标值)。

答案 2 :(得分:1)

基本逻辑可能如下所示,您可以在javascript中为间隔计时器调整此值。

int counter=0;
int delta=1;
bool finished=false;
while(!finished)
{
   counter+=delta;
   if(counter==3)
   {
      delta=-1;
   }
   if(counter==0)
   {
      delta=1;
   }
   if(condition to end loop is met)
   {
      finished=true;
   }

}