- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我现在在 JavaScript 中反复遇到一个奇怪的问题。我似乎不能再延迟 setInterval
。
发生的事情的一个小例子:
var loop;
var count;
loop = setInterval(start, 30);
function start() {
//Some code
delay();
//Some more code
}
function delay() {
setTimeout(function () {
count++;
//Animation code
if (count <= 1000) delay();
}, 100);
}
现在我想做的是,执行“一些代码”部分,在“动画代码”执行时什么都不做,然后执行“更多代码”部分。
发生的事情是“更多代码”部分和延迟函数同时执行。我在调用延迟函数之前尝试了 clearInterval(loop)
并在延迟函数完成执行后重新启动它,但是“更多代码”似乎无论如何都会执行一次。
我怎样才能解决这个问题?请举例详细说明。
最佳答案
您的 delay()
函数实际上并没有阻止您的 start()
函数完成。
在 Javascript 中,setTimeout()
不会暂停 Javascript 的执行。相反,它所做的是安排传递给 setTimeout()
的回调在未来的某个时间运行,而您的其余代码将继续运行。
如果你想在一段时间内延迟执行某个代码块,那么你必须将该代码块放入 setTimeout()
回调中,如下所示:
setTimeout(function() {
// the code in here will run some time in the future
}, delayTime);
// the code here will run immediately
这在 Javascript 中经常描述的方式是说对 setTimeout()
的调用是非阻塞的。它不会停止或暂停当前执行线程的运行。事实上,执行线程将运行完成。相反,setTimeout()
安排一个回调函数在将来的特定时间调用(当没有其他 Javascript 代码正在运行时)。
因为 Javascript 是单线程的,它几乎永远不会通过循环来尝试创建延迟,即使您使用非常长的 while()
循环也是如此。问题是,当你在循环时,没有其他 Javascript 代码可以运行,所以没有其他状态可以改变,所以无论你等待改变的循环条件在你循环时都不会改变。这通常只会导致死锁类型的情况,最终浏览器会意识到 Javascript 线程“卡住”并会提示中止它。
相反,您使用事件和 future 回调进行编程。您设置一个事件或计时器回调,以便在将来某个时间发生某事时调用它,然后将相关代码放入该回调或事件处理程序中。还有更高级的工具可以帮助管理这一点,例如 promises 或异步库,但它们只是建立在相同的回调机制之上。
关于javascript - 如何延迟 Javascript 中的 setInterval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29455528/
这个问题已经有答案了: JavaScript closure inside loops – simple practical example (45 个回答) 已关闭 8 年前。 我试图创建多个 se
这是我的情况,我需要加快函数运行时间,所以 setInterval 不是一个明智的选择,对吧?因为每次至少要花费 4 毫秒。 所以,我可以将 setInterval 函数更改为 requestAnim
我正在尝试下面的代码,看看是否可以将 setInterval Id 存储为关联数组中唯一键的值,然后通过使用唯一值作为键来停止被调用函数中的间隔,如下所示我将 setInterval Id 作为它的值
我花了很长时间试图弄清楚如何使用具有 CSS 样式缓动功能的 Google Maps API 为折线上的符号设置动画。我让它工作 with this Gist和 this Google Maps AP
我是这里的 JS 新手,正在研究一个在给定时间段后开始的倒数计时器。基本上,当用户单击按钮时时钟开始,第二个时钟在第一个计时器用完时开始。我知道“setInterval”是完成这个的最好方法。我面临的
嗨, friend 们,我想只使用一个 setInterval 函数来运行我的代码。目前我正在使用两个 setInterval's 来实现我的目标,我们可以只使用一个 'setInterval' 来获
我的“setInterval”函数有问题,我想在将鼠标悬停在 div 上时启动该函数,但是 setInterval 在我将鼠标悬停在 div 上时第一次起作用=>如果我停留在div,它不会继续改变图片
我想展示两次:一次在你的国家,一次在日本用JS 问题是第二个 setInterval 停止了第一个,我不知道如何进行两次运行。 完整代码 In your region:
好吧,这个问题有几个问题。 首先,我要求 setTimeout() 和 setInterval() 我见过几种不同的调用方式,我想知道哪种方式最适合这种情况。 我正在制作一个 js/canvas 游戏
setInterval(function () { //======= //code //======== if(--timer&etype="; } },1000); 这里定时器结束后,而不是重定
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 5 年前。 Improv
我的前老板有一个 weird bug where when he used setInterval with a long delay interval : setInterval(func, 300
这个问题已经有答案了: How does the "this" keyword work, and when should it be used? (22 个回答) How to access the
我的印象是 setInterval("/*some code*/", time) 相当于 setInterval(function() { /*some code*/ }, time) 显然不是
我对 JavaScript 和 NodeJS 非常陌生,我只是想了解 NodeJS 中的发射器模式。当我尝试使用 setInterval 函数每秒发出一个刻度事件时,程序似乎工作正常:-
我有一个简单的 setTimeout 函数,它在特定时间运行并且工作正常: var now = new Date(); var milliTillExec = new Date(now.getFull
在本教程中,您将借助示例了解 JavaScript setInterval() 方法。 在 JavaScript 中,可以在指定的时间间隔内执行一段代码。这些时间间隔称为定时事件。 有
Js: function cometConnect(){ $.ajax({ cache:false, type:"post", d
LE2。关于如何解决此问题的任何其他想法? 我有这段代码,但不知道为什么不能正常工作: $(function autorun() { if ($("#contactForm").is(":visibl
这个问题在这里已经有了答案: How to make a setInterval stop after some time or after a number of actions? (6 个答案)
我是一名优秀的程序员,十分优秀!