[英]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
解决方案。
- 使用
let
关键字,本地范围。
const printNumbers = (n) => { for (let i = 1; i <= n; i++) { setTimeout( () => { console.log(i); }, i * 2000); } } printNumbers(5);
- 使用
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.