为什么setInterval一次记录所有数据,而不是每次等待指定的时间间隔
Why is setInterval logging all data at once instead of waiting for specified interval each time?
我想用for循环每隔两秒打印一些数字。在所有这些代码片段中都需要外循环,因为我需要它来进行其他操作,所以请不要说不需要两个循环。
下面的代码片段等待大约2秒,然后一次打印50次。
for(var i=0;i<1;i++) {
for(var j=1;j<51;j++) {
window.setInterval(function(){
console.log(10*i + j);
}, 2000);
}
}
我认为它会打印1——等待2秒——打印2——等待2秒——以此类推。我认为我要求浏览器在每次循环迭代后停止两秒钟,然后打印数字。此外,我认为打印将在外部循环的一次迭代后停止,但它没有,控制台继续打印61。还有一件事,为什么打印61?
编辑:在zerkms的注释之后,我现在有以下代码:for(var i=0;i<1;i++) {
for(var j=1;j<51;j++) {
window.setTimeout(function(){
console.log(10*i + j);
}, 2000*j);
}
}
它以2秒的间隔打印50行,但每次都保持打印61行。我怎样才能打印出所有的数字?
我认为我要求浏览器在每次内循环迭代后停止两秒钟,然后打印数字。
你只是误解了setInterval
的本质。当你调用setInterval
时,你在说:
浏览器,我要给你一个函数,我要你每两秒钟运行一次,直到我让你停止。
做你想做的事情的一个正确方法是:
var i = 0;
var j = 1;
var interval = window.setInterval(function(){
console.log(i, j);
j++;
if(j > 50) {
j = 0;
i++;
if(i > 4) {
window.clearInterval(interval);
}
}
}, 2000);
你会注意到你不需要任何循环,因为setInterval
已经会为你重复你的函数。如果没有循环,则需要将递增逻辑(i = 0
、i++
等)移动到普通语句中。然后,一旦你想停止,你必须通过clearInterval
告诉浏览器停止。
这很难遵循,所以根据你真正想要完成的事情,很可能有更好的方法。例如,如果您试图以交叉连接的方式遍历一对数组,您可以先将数组平展,从而消除对迭代器的需求。或者你可以使用像RxJS这样的库来用间隔计时器zip
你想要的值。
var everyTwoSeconds = Rx.Observable.interval(2000);
var firstSetOfThings = Rx.Observable.from(['one', 'two', 'three']);
var secondSetOfThings = Rx.Observable.range(1, 50);
var allTheThings = firstSetOfThings.flatMap(secondSetOfThings, function(x, y) {
return "first: " + x + ", second: " + y;
});
everyTwoSeconds.zip(allTheThings, function(i, thing) { console.log(thing); });
相关文章:
- 如何在数组中循环,等待每个项目之间的时间
- JavaScript:等待特定时间的完成
- setTimeOut没有等待适当的延迟时间
- Ajax jQuery同时进行多个调用-等待应答的时间很长,无法取消
- setTimeout未等待指定时间
- 在 PhantomJS 中在页面上下文中的控制台日志之间等待一段时间
- 如何构建一个在上一个 ajax 承诺解析后等待一段时间的 rx 轮询器
- 在网站上等待特定时间以启动流程
- jQuery 设置函数执行前的等待时间
- 1 个同时下载 + 强制等待时间 + 亚马逊 S3
- 使用带有等待时间的requestAnimationFrame
- 我是否应该等待一段时间,通过谷歌验证,才能在我的页面上看到广告
- 我们在firefox开发工具中所说的等待时间是什么意思
- 如何将setInterval周期设置为变量并删除等待时间
- Javascript + Imacro步骤和循环段之间的随机等待时间代码Bug
- 为什么new函数的setTimeout会忽略等待时间
- 为什么Selenium WebDriver不使用JavaScript等待时间参数工作
- 有效地减少时间约束任务之间的等待时间
- 在指定的等待时间后运行javascript
- 绕过Imacros上的最短等待时间