每2秒后打印1至10

时间:2016-10-13 08:43:28

标签: javascript jquery

我想在每n秒后打印一个数字,并根据几个条件我正在更改计时器以及我停止打印功能。我这样做了 -

var myfunc = {
    value   : 1,
    running : false,
    timer   : 1000,
    start   : function(){
        this.running = true;
        clearInterval(this.timeout);
        this.timeout = setTimeout(function() {
            myfunc.execute(myfunc);
        }, myfunc.timer);

    },
    execute : function(){
        if(!this.running) return false;

        console.log( 'Currently at -- ' + (this.value++) );

        if (this.value > 5 ){
            this.changetiming();
        }

        if (this.value > 10 ){
            this.stop();
            return;
        }else{
            this.start();
        }

    },
    changetiming : function(){
        this.timer = 3000;
    },
    stop : function(){
        this.running = false;
        clearTimeout(this.timeout);
    }
};

myfunc.start();

现在我想知道以下代码有什么问题 -

for(var i = 0; i <= 10; i++){
    print(i);
}


function print(i){
    setTimeout(function(){
        console.log(i)
    },2000);
}

7 个答案:

答案 0 :(得分:3)

我很确定这个问题“为什么这个JavaScript代码

for (var i = 0; i <= 10; i++){
    print(i);
}

function print(i) {
    setTimeout(function(){
        console.log(i)
    },2000);
}

在经过2秒后,立即打印出1到10的值?“之前已被问过。”

这是一个常见的错误。

您正在做的是致电print 10次。每次打印调用只需几微秒。为什么?因为它只是调用setTimeout。执行setTimeout只需几微秒即可完成。所有的电话都是日程安排将来会发生的事情。因此,在几微秒内,您将在未来约2秒内安排10件事情。所有的计划大约在同一时间发生。因此,所有控制台日志几乎同时发生,在您安排它们两秒后。

请参阅Satapal对您的问题的评论,以便做出您想做的事情。

答案 1 :(得分:3)

这是在ES6中执行此操作的正确方法和简便方法:

const printNumbersForEvery2Sec = (n)=>{
  for (let i = 1; i <= n; i++) {
      setTimeout( () =>{
        console.log(i)
      }, i * 2000)
    }
}
printNumbersForEvery2Sec(10);

通过乘以i,每个setTimeout()分别延迟2到20秒(2000 x 1,2000 x 2 ...)。

答案 2 :(得分:0)

您可能想尝试一下:

const printNumbersForEvery2Sec = (n)=>{
  for (let i = 1; i <= n; i++) setTimeout(console.log, i * 1000,i) 
}

printNumbersForEvery2Sec(10);```

答案 3 :(得分:0)

您可以使用javascript超时

function timer(n) {
    for (let i = 0; i < 10; i++) {
        setTimeout(function () {
            console.log(i);
        }, i * n);
    }
}

timer(2000);

在上面的代码中,没有对时间进行编码,因此您可以决定所需的时间间隔。

答案 4 :(得分:0)

更通用的解决方案:

function printNumbers(start, end, delay=1){
  const interval = delay*1000
  for(let i=start; i<=end; i++){
      setTimeout(console.log, (i-start)*interval, i)
  }
}

printNumbers(3, 10, 2) // firstNumber, lastNumber, timeInSeconds

答案 5 :(得分:0)

#easiestway

for (var i = 0; i <= 10; i++){
    print(i);
}

function print(i) {
    setTimeout(function(){
        console.log(i)
    },i*2000);
}

答案 6 :(得分:0)

使用 IIFE、Clouser 和全局范围

(function(numbers){
  for(var i=0; i<numbers.length; i++){
    (function(i){
      setTimeout(console.log, i*2000, i+1)
    })(i);
  }
})(new Array(10))

OR IIFE 和本地范围

(function(numbers){
  for(let i=0; i<numbers.length; i++){
    setTimeout(console.log, i*2000, i+1)
  }
})(new Array(10))