繁体   English   中英

每 2 秒后打印 1 到 10 的数字

[英]print number from 1 to 10 after every 2 seconds

我想在每 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);
}

这是在 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…)。

我很确定这个问题“为什么这个 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只需几微秒即可完成。 通话所做的只是安排将来发生的事情。 因此,在几微秒内,您已经安排了 10 件事情在未来大约 2 秒内发生。 所有的日程安排几乎在同一时间发生。 因此,所有控制台日志大约在您安排它们的两秒后同时发生。

请参阅 Satapal 对您的问题的评论,了解如何做您想做的事。

#最简单的方式

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

function print(i) {
    setTimeout(function(){
        console.log(i)
    },i*2000);
}
for(var i = 0 ; i <= 10 ; i++) {
  setTimeout( () => { console.log(i) }, i * 1000 );
}

为什么我们不能在 var 的帮助下打印 0 到 10 no? 为什么我们可以用 let 做?

你可能想试试这个:

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

printNumbersForEvery2Sec(10);```

您可以使用javascript的超时

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

在上面的代码中,时间没有被编码,所以你可以决定你想要多少间隔。

更通用的解决方案:

 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

使用 IIFE、Cluser 和全局范围

(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))

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

远最好! 和简单的解决方案...结帐片段...

for (let i = 1; i <= 10; i++) {
  setTimeout(() => {
    console.log(i)
  }, (i * 2000) )
}
const RandomUnderHundredNumber = (min,max) => {
min = Math.ceil(min);
max = Math.floor(max); 
return Math.floor(Math.random() * (max - min + 1)) + min; /*min and max numbers are included */
}
let inter
const testFunction = () => {
inter = setInterval(() => console.log(RandomUnderHundredNumber(0,99)), 1000) // generate number between 0 and 99 every 1 sec  
}
testFunction();
setTimeout(function( ) { clearInterval(inter); }, 5000); /* clear interval after 5 sec delay (optional) */

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

这个问题有two解决方案。

  1. 使用let关键字,本地范围。

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

  1. 使用var关键字,在closures的帮助下功能范围。

用另一个函数包装 setTimeout 函数,该函数具有该实例的变量值。 哪个控制台记录了正确的值。

示例如下所示。

 const printNumbers = (n) => { for (var i = 1; i <= n; i++) { function helper(num){ setTimeout( () => { console.log(num); }, num * 2000); } helper(i); } } printNumbers(5);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM